From c9faf8b77206b385965b815e06b2b43df49145ea Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 12 Dec 2024 11:33:58 -0600 Subject: [PATCH 01/63] source-google-sheets: adding dymamic streams and dynamic schemas for goodle-sheets --- .../source-google-sheets/poetry.lock | 1831 +++++++++++------ .../source-google-sheets/pyproject.toml | 4 +- .../source_google_sheets/manifest.yaml | 121 ++ .../source_google_sheets/run.py | 45 +- .../source_google_sheets/source_dymamic.py | 21 + 5 files changed, 1391 insertions(+), 631 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index e738846375155..fc04e246a165e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -1,59 +1,65 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "airbyte-cdk" -version = "4.3.2" +version = "6.9.2.dev4100" description = "A framework for writing Airbyte Connectors." optional = false -python-versions = "<4.0,>=3.10" +python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-4.3.2-py3-none-any.whl", hash = "sha256:1dd92de77e2212b13ed6f1e9c4b2559baa905eff6db5bf14b0fbaf1149e60e4c"}, - {file = "airbyte_cdk-4.3.2.tar.gz", hash = "sha256:89db68167e214e5b55d5ef5f821f017ee64bf859f44c60bc0169071fa376e9af"}, + {file = "airbyte_cdk-6.9.2.dev4100-py3-none-any.whl", hash = "sha256:748efc1d969573234ab480829899d6f31d04a74207d70d73fc03e1202ee52c1d"}, + {file = "airbyte_cdk-6.9.2.dev4100.tar.gz", hash = "sha256:95deeb945a9f0d1039a6da50b315dd57109cb5e96247ad4235700fc8871af82f"}, ] [package.dependencies] -airbyte-protocol-models-pdv2 = ">=0.12.2,<0.13.0" +airbyte-protocol-models-dataclasses = ">=0.14,<0.15" backoff = "*" cachetools = "*" -cryptography = ">=42.0.5,<43.0.0" -Deprecated = ">=1.2,<1.3" +cryptography = ">=42.0.5,<44.0.0" dpath = ">=2.1.6,<3.0.0" -genson = "1.2.2" +dunamai = ">=1.22.0,<2.0.0" +genson = "1.3.0" isodate = ">=0.6.1,<0.7.0" Jinja2 = ">=3.1.2,<3.2.0" jsonref = ">=0.2,<0.3" -jsonschema = ">=3.2.0,<3.3.0" +jsonschema = ">=4.17.3,<4.18.0" langchain_core = "0.1.42" +nltk = "3.9.1" +numpy = "<2" +orjson = ">=3.10.7,<4.0.0" +pandas = "2.2.2" pendulum = "<3.0.0" +psutil = "6.1.0" pydantic = ">=2.7,<3.0" pyjwt = ">=2.8.0,<3.0.0" pyrate-limiter = ">=3.1.0,<3.2.0" python-dateutil = "*" +python-ulid = ">=3.0.0,<4.0.0" pytz = "2024.1" PyYAML = ">=6.0.1,<7.0.0" +rapidfuzz = ">=3.10.1,<4.0.0" requests = "*" requests_cache = "*" -wcmatch = "8.4" +serpyco-rs = ">=1.10.2,<2.0.0" +wcmatch = "10.0" +xmltodict = ">=0.13.0,<0.14.0" [package.extras] -file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] -sphinx-docs = ["Sphinx (>=4.2,<4.3)", "sphinx-rtd-theme (>=1.0,<1.1)"] -vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.4.0)"] +file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "python-snappy (==0.7.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] +sql = ["sqlalchemy (>=2.0,!=2.0.36,<3.0)"] +vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.8.0)"] [[package]] -name = "airbyte-protocol-models-pdv2" -version = "0.12.2" -description = "Declares the Airbyte Protocol." +name = "airbyte-protocol-models-dataclasses" +version = "0.14.1" +description = "Declares the Airbyte Protocol using Python Dataclasses. Dataclasses in Python have less performance overhead compared to Pydantic models, making them a more efficient choice for scenarios where speed and memory usage are critical" optional = false python-versions = ">=3.8" files = [ - {file = "airbyte_protocol_models_pdv2-0.12.2-py3-none-any.whl", hash = "sha256:8b3f9d0388928547cdf2e9134c0d589e4bcaa6f63bf71a21299f6824bfb7ad0e"}, - {file = "airbyte_protocol_models_pdv2-0.12.2.tar.gz", hash = "sha256:130c9ab289f3f53749ce63ff1abbfb67a44b7e5bd2794865315a2976138b672b"}, + {file = "airbyte_protocol_models_dataclasses-0.14.1-py3-none-any.whl", hash = "sha256:dfe10b32ee09e6ba9b4f17bd309e841b61cbd61ec8f80b1937ff104efd6209a9"}, + {file = "airbyte_protocol_models_dataclasses-0.14.1.tar.gz", hash = "sha256:f62a46556b82ea0d55de144983141639e8049d836dd4e0a9d7234c5b2e103c08"}, ] -[package.dependencies] -pydantic = ">=2.7.2,<3.0.0" - [[package]] name = "annotated-types" version = "0.7.0" @@ -65,6 +71,28 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "anyio" +version = "4.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + [[package]] name = "atomicwrites" version = "1.4.1" @@ -75,6 +103,17 @@ files = [ {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, ] +[[package]] +name = "attributes-doc" +version = "0.4.0" +description = "PEP 224 implementation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "attributes-doc-0.4.0.tar.gz", hash = "sha256:b1576c94a714e9fc2c65c47cf10d0c8e1a5f7c4f5ae7f69006be108d95cbfbfb"}, + {file = "attributes_doc-0.4.0-py2.py3-none-any.whl", hash = "sha256:4c3007d9e58f3a6cb4b9c614c4d4ce2d92161581f28e594ddd8241cc3a113bdd"}, +] + [[package]] name = "attrs" version = "24.2.0" @@ -107,35 +146,35 @@ files = [ [[package]] name = "bracex" -version = "2.5" +version = "2.5.post1" description = "Bash style brace expander." optional = false python-versions = ">=3.8" files = [ - {file = "bracex-2.5-py3-none-any.whl", hash = "sha256:d2fcf4b606a82ac325471affe1706dd9bbaa3536c91ef86a31f6b766f3dad1d0"}, - {file = "bracex-2.5.tar.gz", hash = "sha256:0725da5045e8d37ea9592ab3614d8b561e22c3c5fde3964699be672e072ab611"}, + {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, + {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, ] [[package]] name = "cachetools" -version = "5.4.0" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, - {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] name = "cattrs" -version = "23.2.3" +version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" files = [ - {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, - {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, + {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, + {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, ] [package.dependencies] @@ -147,6 +186,7 @@ typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_ver bson = ["pymongo (>=4.4.0)"] cbor2 = ["cbor2 (>=5.4.6)"] msgpack = ["msgpack (>=1.0.5)"] +msgspec = ["msgspec (>=0.18.5)"] orjson = ["orjson (>=3.9.2)"] pyyaml = ["pyyaml (>=6.0)"] tomlkit = ["tomlkit (>=0.11.8)"] @@ -154,89 +194,89 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, - {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, - {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, - {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, - {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, - {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, - {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, - {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, - {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, - {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, - {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, - {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, - {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, - {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, - {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, - {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -244,103 +284,132 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -354,43 +423,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -403,26 +467,9 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - [[package]] name = "dpath" version = "2.2.0" @@ -434,6 +481,20 @@ files = [ {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, ] +[[package]] +name = "dunamai" +version = "1.23.0" +description = "Dynamic version generation" +optional = false +python-versions = ">=3.5" +files = [ + {file = "dunamai-1.23.0-py3-none-any.whl", hash = "sha256:a0906d876e92441793c6a423e16a4802752e723e9c9a5aabdc5535df02dbe041"}, + {file = "dunamai-1.23.0.tar.gz", hash = "sha256:a163746de7ea5acb6dacdab3a6ad621ebc612ed1e528aaa8beedb8887fccd2c4"}, +] + +[package.dependencies] +packaging = ">=20.9" + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -450,23 +511,24 @@ test = ["pytest (>=6)"] [[package]] name = "genson" -version = "1.2.2" +version = "1.3.0" description = "GenSON is a powerful, user-friendly JSON Schema generator." optional = false python-versions = "*" files = [ - {file = "genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] [[package]] name = "google-api-core" -version = "2.19.1" +version = "2.24.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, - {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, + {file = "google_api_core-2.24.0-py3-none-any.whl", hash = "sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9"}, + {file = "google_api_core-2.24.0.tar.gz", hash = "sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf"}, ] [package.dependencies] @@ -477,6 +539,7 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 requests = ">=2.18.0,<3.0.0.dev0" [package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] @@ -501,13 +564,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.33.0" +version = "2.36.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, - {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, + {file = "google_auth-2.36.0-py2.py3-none-any.whl", hash = "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb"}, + {file = "google_auth-2.36.0.tar.gz", hash = "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"}, ] [package.dependencies] @@ -517,7 +580,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -539,13 +602,13 @@ httplib2 = ">=0.19.0" [[package]] name = "googleapis-common-protos" -version = "1.63.2" +version = "1.66.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, - {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, + {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, + {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, ] [package.dependencies] @@ -554,6 +617,38 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + [[package]] name = "httplib2" version = "0.22.0" @@ -568,17 +663,44 @@ files = [ [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -621,6 +743,17 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -659,24 +792,22 @@ files = [ [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.17.3" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, ] [package.dependencies] attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] name = "langchain-core" @@ -702,156 +833,250 @@ extended-testing = ["jinja2 (>=3,<4)"] [[package]] name = "langsmith" -version = "0.1.99" +version = "0.1.147" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.99-py3-none-any.whl", hash = "sha256:ef8d1d74a2674c514aa429b0171a9fbb661207dc3835142cca0e8f1bf97b26b0"}, - {file = "langsmith-0.1.99.tar.gz", hash = "sha256:b5c6a1f158abda61600a4a445081ee848b4a28b758d91f2793dc02aeffafcaf1"}, + {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, + {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, ] [package.dependencies] -orjson = ">=3.9.14,<4.0.0" +httpx = ">=0.23.0,<1" +orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} pydantic = [ {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" + +[package.extras] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "nltk" +version = "3.9.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.8" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "orjson" -version = "3.10.7" +version = "3.10.12" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, - {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, - {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, - {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, - {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, - {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, - {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, - {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, - {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, - {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, - {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, - {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, - {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, - {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, - {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, - {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, - {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, - {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, - {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, - {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, + {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, + {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, + {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, + {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, + {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, + {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, + {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, + {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, + {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, + {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, + {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, + {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, + {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, + {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, + {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, + {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, + {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, + {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, + {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, ] [[package]] @@ -865,6 +1090,79 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + [[package]] name = "pendulum" version = "2.1.2" @@ -901,19 +1199,19 @@ pytzdata = ">=2020.1" [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -932,13 +1230,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "proto-plus" -version = "1.24.0" +version = "1.25.0" description = "Beautiful, Pythonic protocol buffers." optional = false python-versions = ">=3.7" files = [ - {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, - {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, + {file = "proto_plus-1.25.0-py3-none-any.whl", hash = "sha256:c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961"}, + {file = "proto_plus-1.25.0.tar.gz", hash = "sha256:fbb17f57f7bd05a68b7707e745e26528b0b3c34e378db91eef93912c54982d91"}, ] [package.dependencies] @@ -949,24 +1247,54 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.27.3" +version = "5.29.1" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, - {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, - {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, - {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, - {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, - {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, - {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, - {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, - {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, + {file = "protobuf-5.29.1-cp310-abi3-win32.whl", hash = "sha256:22c1f539024241ee545cbcb00ee160ad1877975690b16656ff87dde107b5f110"}, + {file = "protobuf-5.29.1-cp310-abi3-win_amd64.whl", hash = "sha256:1fc55267f086dd4050d18ef839d7bd69300d0d08c2a53ca7df3920cc271a3c34"}, + {file = "protobuf-5.29.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d473655e29c0c4bbf8b69e9a8fb54645bc289dead6d753b952e7aa660254ae18"}, + {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5ba1d0e4c8a40ae0496d0e2ecfdbb82e1776928a205106d14ad6985a09ec155"}, + {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ee1461b3af56145aca2800e6a3e2f928108c749ba8feccc6f5dd0062c410c0d"}, + {file = "protobuf-5.29.1-cp38-cp38-win32.whl", hash = "sha256:50879eb0eb1246e3a5eabbbe566b44b10348939b7cc1b267567e8c3d07213853"}, + {file = "protobuf-5.29.1-cp38-cp38-win_amd64.whl", hash = "sha256:027fbcc48cea65a6b17028510fdd054147057fa78f4772eb547b9274e5219331"}, + {file = "protobuf-5.29.1-cp39-cp39-win32.whl", hash = "sha256:5a41deccfa5e745cef5c65a560c76ec0ed8e70908a67cc8f4da5fce588b50d57"}, + {file = "protobuf-5.29.1-cp39-cp39-win_amd64.whl", hash = "sha256:012ce28d862ff417fd629285aca5d9772807f15ceb1a0dbd15b88f58c776c98c"}, + {file = "protobuf-5.29.1-py3-none-any.whl", hash = "sha256:32600ddb9c2a53dedc25b8581ea0f1fd8ea04956373c0c07577ce58d312522e0"}, + {file = "protobuf-5.29.1.tar.gz", hash = "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb"}, +] + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + [[package]] name = "py" version = "1.11.0" @@ -980,24 +1308,24 @@ files = [ [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.4.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] @@ -1016,122 +1344,131 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.10.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.27.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, ] [package.dependencies] @@ -1139,13 +1476,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyjwt" -version = "2.9.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.extras] @@ -1156,13 +1493,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -1279,6 +1616,20 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-ulid" +version = "3.0.0" +description = "Universally unique lexicographically sortable identifier" +optional = false +python-versions = ">=3.9" +files = [ + {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, + {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, +] + +[package.extras] +pydantic = ["pydantic (>=2.0)"] + [[package]] name = "pytz" version = "2024.1" @@ -1363,6 +1714,209 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "rapidfuzz" +version = "3.10.1" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:779027d3307e1a2b1dc0c03c34df87a470a368a1a0840a9d2908baf2d4067956"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:440b5608ab12650d0390128d6858bc839ae77ffe5edf0b33a1551f2fa9860651"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cac41a411e07a6f3dc80dfbd33f6be70ea0abd72e99c59310819d09f07d945"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:958473c9f0bca250590200fd520b75be0dbdbc4a7327dc87a55b6d7dc8d68552"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef60dfa73749ef91cb6073be1a3e135f4846ec809cc115f3cbfc6fe283a5584"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fbac18f2c19fc983838a60611e67e3262e36859994c26f2ee85bb268de2355"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a0d519ff39db887cd73f4e297922786d548f5c05d6b51f4e6754f452a7f4296"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bebb7bc6aeb91cc57e4881b222484c26759ca865794187217c9dcea6c33adae6"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe07f8b9c3bb5c5ad1d2c66884253e03800f4189a60eb6acd6119ebaf3eb9894"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfa48a4a2d45a41457f0840c48e579db157a927f4e97acf6e20df8fc521c79de"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cf44d01bfe8ee605b7eaeecbc2b9ca64fc55765f17b304b40ed8995f69d7716"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e6bbca9246d9eedaa1c84e04a7f555493ba324d52ae4d9f3d9ddd1b740dcd87"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win32.whl", hash = "sha256:567f88180f2c1423b4fe3f3ad6e6310fc97b85bdba574801548597287fc07028"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6b2cd7c29d6ecdf0b780deb587198f13213ac01c430ada6913452fd0c40190fc"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_arm64.whl", hash = "sha256:9f912d459e46607ce276128f52bea21ebc3e9a5ccf4cccfef30dd5bddcf47be8"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac7adee6bcf0c6fee495d877edad1540a7e0f5fc208da03ccb64734b43522d7a"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:425f4ac80b22153d391ee3f94bc854668a0c6c129f05cf2eaf5ee74474ddb69e"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65a2fa13e8a219f9b5dcb9e74abe3ced5838a7327e629f426d333dfc8c5a6e66"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75561f3df9a906aaa23787e9992b228b1ab69007932dc42070f747103e177ba8"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd062490537e97ca125bc6c7f2b7331c2b73d21dc304615afe61ad1691e15d5"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfcc8feccf63245a22dfdd16e222f1a39771a44b870beb748117a0e09cbb4a62"}, + {file = "rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979"}, +] + +[package.extras] +all = ["numpy"] + +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + [[package]] name = "requests" version = "2.32.3" @@ -1431,6 +1985,20 @@ requests = ">=2.22,<3" [package.extras] fixture = ["fixtures"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "rsa" version = "4.9" @@ -1446,30 +2014,79 @@ files = [ pyasn1 = ">=0.1.3" [[package]] -name = "setuptools" -version = "72.1.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +name = "serpyco-rs" +version = "1.11.0" +description = "" optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, +python-versions = ">=3.9" +files = [ + {file = "serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4b2bd933539bd8c84315e2fb5ae52ef7a58ace5a6dfe3f8b73f74dc71216779e"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627f957889ff73c4d2269fc7b6bba93212381befe03633e7cb5495de66ba9a33"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0933620abc01434023e0e3e22255b7e4ab9b427b5a9a5ee00834656d792377a"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9ce46683d92e34abb20304817fc5ac6cb141a06fc7468dedb1d8865a8a9682f6"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bda437d86e8859bf91c189c1f4650899822f6d6d7b02b48f5729da904eb7bb7d"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a72bfbd282af17ebe76d122639013e802c09902543fdbbd828fb2159ec9755e"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d4808df5384e3e8581e31a90ba7a1fa501c0837b1f174284bb8a4555b6864ea"}, + {file = "serpyco_rs-1.11.0-cp310-none-win_amd64.whl", hash = "sha256:c7b60aef4c16d68efb0d6241f05d0a434d873d98449cbb4366b0d385f0a7172b"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d47ee577cf4d69b53917615cb031ad8708eb2f59fe78194b1968c13130fc2f7"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6090d9a1487237cdd4e9362a823eede23249602019b917e7bd57846179286e79"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7192eb3df576386fefd595ea31ae25c62522841ffec7e7aeb37a80b55bdc3213"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b52ef8affb7e71b9b98a7d5216d6a7ad03b04e990acb147cd9211c8b931c5487"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3480e09e473560c60e74aaa789e6b4d079637371aae0a98235440111464bbba7"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c92e36b0ab6fe866601c2331f7e99c809a126d21963c03d8a5c29331526deed"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84f497361952d4566bc1f77e9e15a84a2614f593cc671fbf0a0fa80046f9c3d7"}, + {file = "serpyco_rs-1.11.0-cp311-none-win_amd64.whl", hash = "sha256:37fc1cf192bef9784fbf1f4e03cec21750b9e704bef55cc0442f71a715eee920"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3ea93d485f03dc8b0cfb0d477f0ad2e86e78f0461b53010656ab5b4db1b41fb0"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7772410d15694b03f9c5500a2c47d62eed76e191bea4087ad042250346b1a38e"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42118463c1679846cffd2f06f47744c9b9eb33c5d0448afd88ea19e1a81a8ddd"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:79481a455b76cc56021dc55bb6d5bdda1b2b32bcb6a1ee711b597140d112e9b1"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8fd79051f9af9591fc03cf7d3033ff180416301f6a4fd3d1e3d92ebd2d68697"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c8f9aeed734a3b51f7349d04ec9063516ffa4e10b632d75e9b1309e4930e4"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15609158b0d9591ffa118302cd9d0039970cb3faf91dce32975f7d276e7411d5"}, + {file = "serpyco_rs-1.11.0-cp312-none-win_amd64.whl", hash = "sha256:00081eae77fbf4c5d88371c5586317ab02ccb293a330b460869a283edf2b7b69"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3028893366a1985adcedb13fa8f6f98c087c185efc427f94c2ccdafa40f45832"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c18bf511316f3abf648a68ee62ef88617bec57d3fcde69466b4361102715ae5"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7dde9ef09cdfaf7c62378186b9e29f54ec76114be4c347be6a06dd559c5681e"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:18500ebc5e75285841e35585a238629a990b709e14f68933233640d15ca17d5f"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47c23132d4e03982703a7630aa09877b41e499722142f76b6153f6619b612f3"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f8e6ba499f6a0825bee0d8f8764569d367af871b563fc6512c171474e8e5383"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15438a076047c34cff6601a977df54948e8d39d1a86f89d05c48bc60f4c12a61"}, + {file = "serpyco_rs-1.11.0-cp313-none-win_amd64.whl", hash = "sha256:84ee2c109415bd81904fc9abb9aec86a5dd13166808c21142cf23ec639f683bd"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5c97c16c865261577fac4effeccc7ef5e0a1e8e35e7a3ee6c90c77c3a4cd7ff9"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47825e70f86fd6ef7c4a835dea3d6e8eef4fee354ed7b39ced99f31aba74a86e"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24d220220365110edba2f778f41ab3cf396883da0f26e1361a3ada9bd0227f73"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a46f334af5a9d77acc6e1e58f355ae497900a2798929371f0545e274f6e6166"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d72b748acce4b4e3c7c9724e1eb33d033a1c26b08a698b393e0288060e0901"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2b8b6f205e8cc038d4d30dd0e70eece7bbecc816eb2f3787c330dc2218e232d"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038d748bfff31f150f0c3edab2766b8843edb952cb1bd3bf547886beb0912dae"}, + {file = "serpyco_rs-1.11.0-cp39-none-win_amd64.whl", hash = "sha256:0fee1c89ec2cb013dc232e4ebef88e2844357ce8631063b56639dbfb83762f20"}, + {file = "serpyco_rs-1.11.0.tar.gz", hash = "sha256:70a844615ffb229e6e89c204b3ab7404aacaf2838911814c7d847969b8da2e3a"}, ] -[package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +[package.dependencies] +attributes-doc = "*" +typing-extensions = "*" [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -1498,6 +2115,27 @@ files = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1509,6 +2147,17 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + [[package]] name = "unidecode" version = "1.3.8" @@ -1547,13 +2196,13 @@ six = "*" [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1564,98 +2213,30 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcmatch" -version = "8.4" +version = "10.0" description = "Wildcard/glob file name matcher." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wcmatch-8.4-py3-none-any.whl", hash = "sha256:dc7351e5a7f8bbf4c6828d51ad20c1770113f5f3fd3dfe2a03cfde2a63f03f98"}, - {file = "wcmatch-8.4.tar.gz", hash = "sha256:ba4fc5558f8946bf1ffc7034b05b814d825d694112499c86035e0e4d398b6a67"}, + {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, + {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, ] [package.dependencies] bracex = ">=2.1.1" [[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=3.6" +python-versions = ">=3.4" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, ] [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "fc97daf8066bcef48f865c1d5c99c4fac3598a21566f32269944004ac7cbc993" +python-versions = ">=3.10,<3.13" +content-hash = "76e025f893ffaa8fd1c64656be066f7d90f9cd95d8c3c322364014bccd29505f" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index af6535ac7df65..9a377ec98cf7e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -16,8 +16,8 @@ repository = "https://github.com/airbytehq/airbyte" include = "source_google_sheets" [tool.poetry.dependencies] -python = "^3.10" -airbyte-cdk = "^4" +python = ">=3.10,<3.13" +airbyte-cdk = "6.9.2.dev4100" google-auth-httplib2 = "==0.2.0" Unidecode = "==1.3.8" google-api-python-client = "==2.114.0" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml new file mode 100644 index 0000000000000..dfa383e2cefc3 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -0,0 +1,121 @@ +version: 6.7.0 + +type: DeclarativeSource + +check: + stream_names: [] + type: CheckStream + +dynamic_streams: + - type: DynamicDeclarativeStream + stream_template: + name: "" + primary_key: [] + retriever: + paginator: + type: NoPagination + record_selector: + extractor: + field_path: + - valueRanges + - "*" + type: DpathExtractor + type: RecordSelector + requester: + $ref: "#/definitions/base_requester" + $parameters: + sheet_id: "" + http_method: GET + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!2:202&majorDimension=ROWS&alt=json' + type: SimpleRetriever + schema_loader: + retriever: + paginator: + type: NoPagination + record_selector: + extractor: + field_path: + - sheets + - "*" + - data + - "*" + - rowData + - "*" + type: DpathExtractor + type: RecordSelector + requester: + $ref: "#/definitions/base_requester" + $parameters: + sheet_id: "" + parsed_spreadsheet_id: "" + http_method: GET + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' + type: SimpleRetriever + schema_type_identifier: + key_pointer: + - formattedValue + schema_pointer: + - values + type: DynamicSchemaLoader + type: DeclarativeStream + components_resolver: + components_mapping: + - field_path: + - name + type: ComponentMappingDefinition + value: "{{components_values['title']}}" + - field_path: + - retriever + - requester + - $parameters + - sheet_id + type: ComponentMappingDefinition + value: "{{components_values['title']}}" + - field_path: + - schema_loader + - retriever + - requester + - $parameters + - sheet_id + type: ComponentMappingDefinition + value: "{{components_values['title']}}" + retriever: + paginator: + type: NoPagination + record_selector: + extractor: + field_path: + - sheets + - "*" + - properties + type: DpathExtractor + type: RecordSelector + requester: + $ref: "#/definitions/base_requester" + http_method: GET + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json' + type: SimpleRetriever + type: HttpComponentsResolver + +definitions: + base_requester: + type: HttpRequester + url_base: https://sheets.googleapis.com/v4/spreadsheets/ + authenticator: "#/definitions/authenticator" + bearer_authenticator: + type: BearerAuthenticator + api_token: "{{ config['credentials']['access_token'] }}" + oauth_authenticator: + type: OAuthAuthenticator + refresh_request_body: {} + token_refresh_endpoint: https://www.googleapis.com/oauth2/v4/token + grant_type: refresh_token + client_id: '{{ config["credentials"]["client_id"] }}' + client_secret: '{{ config["credentials"]["client_secret"] }}' + refresh_token: '{{ config["credentials"]["refresh_token"] }}' + authenticator: + type: SelectiveAuthenticator + authenticator_selection_path: ["credentials", "auth_type"] + authenticators: + Client: "#/definitions/oauth_authenticator" + Service: "#/definitions/bearer_authenticator" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index a34dfe611d013..54e7ed54591a3 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -4,12 +4,49 @@ import sys +import traceback +from datetime import datetime +from typing import List -from airbyte_cdk.entrypoint import launch +from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch +from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type +from orjson import orjson +from source_google_sheets.source_dymamic import SourceDynamicGoogleSheets -from .source import SourceGoogleSheets + +def _get_source(args: List[str]): + catalog_path = AirbyteEntrypoint.extract_catalog(args) + config_path = AirbyteEntrypoint.extract_config(args) + state_path = AirbyteEntrypoint.extract_state(args) + try: + return SourceDynamicGoogleSheets( + SourceDynamicGoogleSheets.read_catalog(catalog_path) if catalog_path else None, + SourceDynamicGoogleSheets.read_config(config_path) if config_path else None, + SourceDynamicGoogleSheets.read_state(state_path) if state_path else None, + ) + except Exception as error: + print( + orjson.dumps( + AirbyteMessageSerializer.dump( + AirbyteMessage( + type=Type.TRACE, + trace=AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=int(datetime.now().timestamp() * 1000), + error=AirbyteErrorTraceMessage( + message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}", + stack_trace=traceback.format_exc(), + ), + ), + ) + ) + ).decode() + ) + return None def run(): - source = SourceGoogleSheets() - launch(source, sys.argv[1:]) + _args = sys.argv[1:] + source = _get_source(_args) + if source: + launch(source, _args) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py new file mode 100644 index 0000000000000..4500270c8e375 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py @@ -0,0 +1,21 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# + +from typing import Any, Mapping, Optional + +from airbyte_cdk.models import ConfiguredAirbyteCatalog +from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource +from airbyte_cdk.sources.source import TState + +""" +This file provides the necessary constructs to interpret a provided declarative YAML configuration file into +source connector. +WARNING: Do not modify this file. +""" + + +# Declarative Source +class SourceDynamicGoogleSheets(YamlDeclarativeSource): + def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): + super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) From b4f8debe0816591e9544fe1c71810a2e58e58773 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Sat, 14 Dec 2024 12:27:57 -0600 Subject: [PATCH 02/63] source-google-sheets: add custom retriever with custom slicer for ranges --- .../source_google_sheets/components.py | 38 ++++++++++++ .../source_google_sheets/manifest.yaml | 58 ++++++++++++------- 2 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py new file mode 100644 index 0000000000000..c37dc7d588774 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py @@ -0,0 +1,38 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +from typing import Any, Iterable, Mapping, Optional + +from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter +from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever +from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer +from airbyte_cdk.sources.types import Config, Record, StreamSlice, StreamState + + +class RangePartitionRouter(SinglePartitionRouter): + def __init__(self, row_count: int = 0, batch_size: int = 200, **kwargs): + super().__init__(**kwargs) + self.row_count = row_count + self.batch_size = batch_size + + def stream_slices(self) -> Iterable[StreamSlice]: + start_range = 2 + while start_range <= self.row_count: + end_range = start_range + self.batch_size + yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) + start_range += self.batch_size + 1 + + +class RangeRetriever(SimpleRetriever): + parameters: Mapping[str, Any] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + parameters = kwargs.get("parameters") + self.stream_slicer: StreamSlicer = RangePartitionRouter( + parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) + ) + + def stream_slices(self) -> Iterable[Optional[StreamSlice]]: # type: ignore + return self.stream_slicer.stream_slices() diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index dfa383e2cefc3..4355a55cbed9c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -9,9 +9,13 @@ check: dynamic_streams: - type: DynamicDeclarativeStream stream_template: + type: DeclarativeStream name: "" primary_key: [] retriever: + $parameters: + row_count: 0 + class_name: "source_google_sheets.components.RangeRetriever" paginator: type: NoPagination record_selector: @@ -21,13 +25,20 @@ dynamic_streams: - "*" type: DpathExtractor type: RecordSelector + $parameters: + name: "" requester: $ref: "#/definitions/base_requester" $parameters: sheet_id: "" + name: "" http_method: GET - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!2:202&majorDimension=ROWS&alt=json' - type: SimpleRetriever + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json' + # stream_slicer: + # class_name: source_google_sheets.components.RangePartitionRouter + # type: CustomStreamSlicer + type: CustomRetriever + # type: SimpleRetriever schema_loader: retriever: paginator: @@ -57,8 +68,26 @@ dynamic_streams: schema_pointer: - values type: DynamicSchemaLoader - type: DeclarativeStream components_resolver: + type: HttpComponentsResolver + description: We use spreadsheet information (sheets) to create streams. + retriever: + paginator: + type: NoPagination + record_selector: + extractor: + field_path: + - sheets + - "*" + - properties + type: DpathExtractor + type: RecordSelector + requester: + $ref: "#/definitions/base_requester" + description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. + http_method: GET + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json' + type: SimpleRetriever components_mapping: - field_path: - name @@ -79,23 +108,12 @@ dynamic_streams: - sheet_id type: ComponentMappingDefinition value: "{{components_values['title']}}" - retriever: - paginator: - type: NoPagination - record_selector: - extractor: - field_path: - - sheets - - "*" - - properties - type: DpathExtractor - type: RecordSelector - requester: - $ref: "#/definitions/base_requester" - http_method: GET - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json' - type: SimpleRetriever - type: HttpComponentsResolver + - field_path: + - retriever + - $parameters + - row_count + type: ComponentMappingDefinition + value: "{{components_values['gridProperties']['rowCount']}}" definitions: base_requester: From 86f4cc93496f0055bee4c4861ccb77334e097473 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 16 Dec 2024 16:54:44 -0600 Subject: [PATCH 03/63] source-google-sheets: fix nested records in value field with custom extractor that matches schema properties with values --- .../source_google_sheets/components.py | 38 -------- .../components/__init__.py | 4 + .../components/extractors.py | 66 +++++++++++++ .../components/partition_routers.py | 28 ++++++ .../components/resolvers.py | 82 ++++++++++++++++ .../components/retrievers.py | 96 +++++++++++++++++++ .../components/transformers.py | 11 +++ .../source_google_sheets/helpers_.py | 41 ++++++++ .../source_google_sheets/manifest.yaml | 69 ++++++++++--- .../test_read_with_partitions.jsonl | 84 ++++++++++++++++ 10 files changed, 467 insertions(+), 52 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py deleted file mode 100644 index c37dc7d588774..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from typing import Any, Iterable, Mapping, Optional - -from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter -from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever -from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer -from airbyte_cdk.sources.types import Config, Record, StreamSlice, StreamState - - -class RangePartitionRouter(SinglePartitionRouter): - def __init__(self, row_count: int = 0, batch_size: int = 200, **kwargs): - super().__init__(**kwargs) - self.row_count = row_count - self.batch_size = batch_size - - def stream_slices(self) -> Iterable[StreamSlice]: - start_range = 2 - while start_range <= self.row_count: - end_range = start_range + self.batch_size - yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) - start_range += self.batch_size + 1 - - -class RangeRetriever(SimpleRetriever): - parameters: Mapping[str, Any] - - def __init__(self, **kwargs): - super().__init__(**kwargs) - parameters = kwargs.get("parameters") - self.stream_slicer: StreamSlicer = RangePartitionRouter( - parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) - ) - - def stream_slices(self) -> Iterable[Optional[StreamSlice]]: # type: ignore - return self.stream_slicer.stream_slices() diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py new file mode 100644 index 0000000000000..6414a8432bdbb --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -0,0 +1,4 @@ +from source_google_sheets.components.extractors import FieldMatchingExtractor +from source_google_sheets.components.partition_routers import RangePartitionRouter + +__all__ = ["FieldMatchingExtractor", "RangePartitionRouter"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py new file mode 100644 index 0000000000000..2426d506c2e9c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -0,0 +1,66 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# +from dataclasses import dataclass +from typing import Any, Dict, Iterable, List, Mapping, MutableMapping + +import requests +from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor +from source_google_sheets.components.resolvers import resolve_fields_origin + + +@dataclass +class FieldMatchingExtractor(DpathExtractor): + """ " + Current DpathExtractor has problems for this type of data in response: + [ + { + "values": [ + [ + "name1", + "22" + ], + [ + "name2", + "24" + ], + [ + "name3", + "25" + ] + ] + } + ] + + This is because "values" field is a list of lists instead of objects that we could extract with "*". + In order to do so we need the ordered properties from the schema that we can match with each list of values. + Then, if we get a properties object like {0: 'name', 1: 'age'} we end up with: + + {"type":"RECORD","record":{"stream":"a_stream_name","data":{"name":"name1","age":"22"},"emitted_at":1734371904128}} + {"type":"RECORD","record":{"stream":"a_stream_name","data":{"name":"name2","age":"24"},"emitted_at":1734371904134}} + {"type":"RECORD","record":{"stream":"a_stream_name","data":{"name":"name3","age":"25"},"emitted_at":1734371904134}} + """ + + def __post_init__(self, parameters: Mapping[str, Any]) -> None: + super().__post_init__(parameters) + self._values_to_match_key = parameters["values_to_match_key"] + self._stream_schema_ordered_properties = resolve_fields_origin(parameters, config=self.config) + + @staticmethod + def match_properties_with_values(unmatched_values: List[str], ordered_properties: Dict[int, str]): + data = {} + for relevant_index in sorted(ordered_properties.keys()): + if relevant_index >= len(unmatched_values): + break + + unmatch_value = unmatched_values[relevant_index] + if unmatch_value.strip() != "": + data[ordered_properties[relevant_index]] = unmatch_value + yield data + + def extract_records(self, response: requests.Response) -> Iterable[MutableMapping[Any, Any]]: + raw_records_extracted = super().extract_records(response=response) + for raw_record in raw_records_extracted: + unmatched_values_collection = raw_record[self._values_to_match_key] + for unmatched_values in unmatched_values_collection: + yield from FieldMatchingExtractor.match_properties_with_values(unmatched_values, self._stream_schema_ordered_properties) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py new file mode 100644 index 0000000000000..6fb24966774bf --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -0,0 +1,28 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# +from typing import Any, Iterable, Mapping + +from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter +from airbyte_cdk.sources.types import StreamSlice + + +class RangePartitionRouter(SinglePartitionRouter): + """ + Create ranges to request rows data to google sheets api. + """ + + parameters: Mapping[str, Any] + + def __init__(self, parameters: Mapping[str, Any]) -> None: + super().__init__(parameters) + self.parameters = parameters + self.sheet_row_count = parameters.get("row_count", 0) + self.batch_size = parameters.get("batch_size", 200) + + def stream_slices(self) -> Iterable[StreamSlice]: + start_range = 2 + while start_range <= self.sheet_row_count: + end_range = start_range + self.batch_size + yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) + start_range += self.batch_size + 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py new file mode 100644 index 0000000000000..7fe106fa2e6a6 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py @@ -0,0 +1,82 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# +from typing import Any, Iterable, List, MutableMapping, Union + +import dpath +import requests +from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder +from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString +from airbyte_cdk.sources.declarative.models.declarative_component_schema import HttpRequester +from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ModelToComponentFactory +from source_google_sheets.helpers_ import Helpers + + +def _make_interpolated_path(provided_path, parameters): + interpolated_path = [InterpolatedString.create(path, parameters=parameters) for path in provided_path] + for path_index in range(len(interpolated_path)): + if isinstance(interpolated_path[path_index], str): + interpolated_path[path_index] = InterpolatedString.create(interpolated_path[path_index], parameters=parameters) + return interpolated_path + + +def create_requester_from_component_definition(component_definition, config): + factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False, disable_cache=False) + # sheet_headers_requester_definition = parameters.get("headers_requester") + sheet_headers_requester_name = component_definition.get("$parameters", {}).get("name", "") + sheet_headers_requester = factory_constructor.create_component( + model_type=HttpRequester, + component_definition=component_definition, + config=config, + name=sheet_headers_requester_name, + ) + if not sheet_headers_requester.use_cache: + raise Exception("Stream Schema ordered properties requester is required to use cache.") + return sheet_headers_requester + + +def _extract_records_by_path( + response: requests.Response, provided_path: List[Union[InterpolatedString, str]], config +) -> Iterable[MutableMapping[Any, Any]]: + for body in JsonDecoder({}).decode(response): + if len(provided_path) == 0: + extracted = body + else: + path = [path.eval(config) for path in provided_path] + if "*" in path: + extracted = dpath.values(body, path) + else: + extracted = dpath.get(body, path, default=[]) # type: ignore # extracted will be a MutableMapping, given input data structure + if isinstance(extracted, list): + yield from extracted + elif extracted: + yield extracted + else: + yield from [] + + +def request_schema_ordered_properties(sheet_headers_requester, parameters, config): + sheet_data_values_path = _make_interpolated_path(provided_path=parameters["sheet_data_values_path"], parameters=parameters) + sheet_headers = [] + response = sheet_headers_requester.send_request() + fields_to_match_key = parameters["fields_to_match_key"] + sheet_data_values = _extract_records_by_path(response, sheet_data_values_path, config) + for sheet_data_value in sheet_data_values: + schema_property_value = sheet_data_value[fields_to_match_key] + sheet_headers.append(schema_property_value) + + return Helpers.get_sheets_to_column_index_to_name(sheet_headers) + + +def resolve_fields_origin(parameters, config): + try: + fields_to_match_origin = parameters["fields_to_match_origin"] + except KeyError: + raise Exception("Missing required header requester parameter") + + if fields_to_match_origin.get("type") == "HttpRequester": + sheet_headers_requester = create_requester_from_component_definition(fields_to_match_origin, config) + stream_schema_ordered_properties = request_schema_ordered_properties(sheet_headers_requester, parameters, config) + return stream_schema_ordered_properties + else: + return fields_to_match_origin diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py new file mode 100644 index 0000000000000..ef53ecdfd4963 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -0,0 +1,96 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# +from dataclasses import dataclass +from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union + +import dpath +import requests +from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor +from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString +from airbyte_cdk.sources.declarative.models.declarative_component_schema import HttpRequester +from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ModelToComponentFactory +from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter +from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever +from airbyte_cdk.sources.types import StreamSlice +from source_google_sheets.helpers_ import Helpers + + +class RangeRetriever(SimpleRetriever): + parameters: Mapping[str, Any] + + # def __init__(self, **kwargs): + # super().__init__(**kwargs) + # factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False) + # parameters = kwargs.get("parameters") + # self.stream_slicer: StreamSlicer = RangePartitionRouter( + # parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) + # ) + # sheet_headers_requester_definition = parameters.get("sheet_headers_requester") + # sheet_headers_requester_name = sheet_headers_requester_definition.get("$parameters", {}).get("name", "") + # self.sheet_headers_requester = factory_constructor.create_component( + # model_type=HttpRequester, + # component_definition=sheet_headers_requester_definition, + # config=self.config, + # name=sheet_headers_requester_name, + # ) + + # def __post_init__(self, parameters: Mapping[str, Any]) -> None: + # super().__post_init__(parameters) + # factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False) + # # parameters = kwargs.get("parameters") + # self.stream_slicer: StreamSlicer = RangePartitionRouter( + # parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) + # ) + # sheet_headers_requester_definition = parameters.get("sheet_headers_requester") + # sheet_headers_requester_name = sheet_headers_requester_definition.get("$parameters", {}).get("name", "") + # self.sheet_headers_requester = factory_constructor.create_component( + # model_type=HttpRequester, + # component_definition=sheet_headers_requester_definition, + # config=self.config, + # name=sheet_headers_requester_name, + # ) + + def stream_slices(self) -> Iterable[Optional[StreamSlice]]: # type: ignore + return self.stream_slicer.stream_slices() + + # + # def get_sheet_headers(self): + # sheet_headers = self.sheet_headers_requester.send_request() + # return sheet_headers + # + # def read_records( + # self, + # records_schema: Mapping[str, Any], + # stream_slice: Optional[StreamSlice] = None, + # ) -> Iterable[StreamData]: + # yield from super().read_records(records_schema=records_schema, stream_slice=stream_slice) + # + # def _parse_response( + # self, + # response: Optional[requests.Response], + # stream_state: StreamState, + # records_schema: Mapping[str, Any], + # stream_slice: Optional[StreamSlice] = None, + # next_page_token: Optional[Mapping[str, Any]] = None, + # ) -> Iterable[Record]: + # if not response: + # self._last_response = None + # yield from [] + # else: + # get_sheet_headers = self.get_sheet_headers() + # self._last_response = response + # # TODO: add something here or inside select records or record_slector + # # airbyte-integrations/connectors/source-google-sheets/.venv/lib/python3.10/site-packages/airbyte_cdk/sources/declarative/extractors/record_selector.py + # record_generator = self.record_selector.select_records( + # response=response, + # stream_state=stream_state, + # records_schema=records_schema, + # stream_slice=stream_slice, + # next_page_token=next_page_token, + # ) + # self._last_page_size = 0 + # for record in record_generator: + # self._last_page_size += 1 + # self._last_record = record + # yield record diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py new file mode 100644 index 0000000000000..db98fc74a3ae6 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + + +# @dataclass +# class GoogleSheetRowsTransformation(RecordTransformation): +# def __init__(self) -> None: +# super().__init__() +# self.schema_requester = resolve_manifest(source=SourceDynamicGoogleSheets(None, None, None)).record.data["manifest"]["dynamic_streams"][0]["stream_template"]["retriever"]["requester"] +# +# def transform(self, record: MutableMapping[str, Any], **kwargs) -> MutableMapping[str, Any]: +# return record diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py new file mode 100644 index 0000000000000..91b301a62c752 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py @@ -0,0 +1,41 @@ +# +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# + +import json +import logging +import re +from collections import defaultdict +from datetime import datetime +from typing import Dict, FrozenSet, Iterable, List, Tuple + +from airbyte_cdk.models.airbyte_protocol import AirbyteRecordMessage, AirbyteStream, ConfiguredAirbyteCatalog, SyncMode +from google.oauth2 import credentials as client_account +from google.oauth2 import service_account +from googleapiclient import discovery + +from .models.spreadsheet import RowData, Spreadsheet +from .utils import safe_name_conversion + +SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/drive.readonly"] + +logger = logging.getLogger("airbyte") + + +class Helpers(object): + @staticmethod + def get_sheets_to_column_index_to_name(first_row: List, names_conversion: bool = False) -> Dict[int, str]: + # todo: probably I should remove the sheet_id from the dictionary is redundant + sheets_to_column_index_to_name = {} + if names_conversion: + first_row = [safe_name_conversion(h) for h in first_row] + # When performing names conversion, they won't match what is listed in catalog for the majority of cases, + # so they should be cast here in order to have them in records + # columns = {safe_name_conversion(c) for c in columns} + # Find the column index of each header value + idx = 0 + for cell_value in first_row: + # if cell_value in columns: + sheets_to_column_index_to_name[idx] = cell_value + idx += 1 + return sheets_to_column_index_to_name diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 4355a55cbed9c..c5e7802ff7688 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -13,17 +13,40 @@ dynamic_streams: name: "" primary_key: [] retriever: - $parameters: - row_count: 0 - class_name: "source_google_sheets.components.RangeRetriever" + type: SimpleRetriever + partition_router: + type: CustomPartitionRouter + $parameters: + row_count: 0 + batch_size: 0 + class_name: source_google_sheets.components.RangePartitionRouter + description: Partition router that generates ranges for batch fetching. paginator: type: NoPagination record_selector: extractor: + type: CustomRecordExtractor + class_name: source_google_sheets.components.FieldMatchingExtractor + description: Extract record list of values (rows) and matches such values to correct schema property to generate individual records. field_path: - valueRanges - "*" - type: DpathExtractor + $parameters: + # We use these parameters to work with the response in the record selector + sheet_data_values_path: + ["sheets", "*", "data", "*", "rowData", "*", "values", "*"] + fields_to_match_key: "formattedValue" + values_to_match_key: "values" + fields_to_match_origin: + $ref: "#/definitions/base_requester" + $parameters: + # Sheet id is provided by components_resolver + sheet_id: "" + name: "headers_requester" + http_method: GET + use_cache: True + path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' + type: RecordSelector $parameters: name: "" @@ -34,13 +57,10 @@ dynamic_streams: name: "" http_method: GET path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json' - # stream_slicer: - # class_name: source_google_sheets.components.RangePartitionRouter - # type: CustomStreamSlicer - type: CustomRetriever - # type: SimpleRetriever schema_loader: + type: DynamicSchemaLoader retriever: + type: SimpleRetriever paginator: type: NoPagination record_selector: @@ -58,20 +78,18 @@ dynamic_streams: $ref: "#/definitions/base_requester" $parameters: sheet_id: "" - parsed_spreadsheet_id: "" http_method: GET path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' - type: SimpleRetriever schema_type_identifier: key_pointer: - formattedValue schema_pointer: - values - type: DynamicSchemaLoader components_resolver: type: HttpComponentsResolver description: We use spreadsheet information (sheets) to create streams. retriever: + type: SimpleRetriever paginator: type: NoPagination record_selector: @@ -87,33 +105,56 @@ dynamic_streams: description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. http_method: GET path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json' - type: SimpleRetriever components_mapping: - field_path: - name type: ComponentMappingDefinition value: "{{components_values['title']}}" + description: name for dynamic stream. - field_path: + - schema_loader - retriever - requester - $parameters - sheet_id type: ComponentMappingDefinition value: "{{components_values['title']}}" + description: sheet_id for dynamic schema loader requester. - field_path: - - schema_loader - retriever - requester - $parameters - sheet_id type: ComponentMappingDefinition value: "{{components_values['title']}}" + description: sheet_id for dynamic stream retriever requester. + - field_path: + - retriever + - record_selector + - extractor + - $parameters + - fields_to_match_origin + - $parameters + - sheet_id + type: ComponentMappingDefinition + value: "{{components_values['title']}}" + description: sheet_id for for extractor requester that will get correct order of record values. - field_path: - retriever + - partition_router - $parameters - row_count type: ComponentMappingDefinition value: "{{components_values['gridProperties']['rowCount']}}" + description: rows count for dynamic stream partition router (slicer). + - field_path: + - retriever + - partition_router + - $parameters + - batch_size + type: ComponentMappingDefinition + value: "{{config['batch_size']}}" + description: rows count for dynamic stream partition router (slicer). definitions: base_requester: diff --git a/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl b/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl new file mode 100644 index 0000000000000..782158967c7ae --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl @@ -0,0 +1,84 @@ +{"type": "DEBUG", "message": "Debug logs enabled", "data": {}} +{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\"}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\", \"use_cache\": true}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=UTF-8', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Transfer-Encoding': 'chunked', 'Vary': 'Origin, X-Origin, Referer', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'x-l2-request-path': 'l2-managed-6'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"Starting syncing SourceDynamicGoogleSheets"}} +{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\", \"use_cache\": true}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=UTF-8', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Transfer-Encoding': 'chunked', 'Vary': 'Origin, X-Origin, Referer', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'x-l2-request-path': 'l2-managed-6'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as STARTED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906027.854,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"STARTED"}}} +{"type": "DEBUG", "message": "Syncing configured stream: a_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} +{"type": "DEBUG", "message": "Syncing stream instance: a_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} +{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} +{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: a_stream_name "}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=a_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"a_stream_name!A2:B4\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"name1\",\n \"22\"\n ],\n [\n \"name2\",\n \"24\"\n ],\n [\n \"name3\",\n \"25\"\n ]\n ]\n }\n ]\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as RUNNING"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.1719,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"RUNNING"}}} +{"type":"RECORD","record":{"stream":"a_stream_name","data":{"range":"a_stream_name!A2:B4","majorDimension":"ROWS","values":[["name1","22"],["name2","24"],["name3","25"]]},"emitted_at":1734122906881}} +{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"a_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} +{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from a_stream_name stream"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as STOPPED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.3428,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"COMPLETE"}}} +{"type":"LOG","log":{"level":"INFO","message":"Finished syncing a_stream_name"}} +{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as STARTED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.429,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"STARTED"}}} +{"type": "DEBUG", "message": "Syncing configured stream: b_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} +{"type": "DEBUG", "message": "Syncing stream instance: b_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} +{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} +{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: b_stream_name "}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=b_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"b_stream_name!A2:B3\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"name1\",\n \"name1@fake.com\"\n ],\n [\n \"name2\",\n \"name2@fake.com\"\n ]\n ]\n }\n ]\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as RUNNING"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.23,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"RUNNING"}}} +{"type":"RECORD","record":{"stream":"b_stream_name","data":{"range":"b_stream_name!A2:B3","majorDimension":"ROWS","values":[["name1","name1@fake.com"],["name2","name2@fake.com"]]},"emitted_at":1734122907763}} +{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"b_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} +{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from b_stream_name stream"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as STOPPED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.5,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"COMPLETE"}}} +{"type":"LOG","log":{"level":"INFO","message":"Finished syncing b_stream_name"}} +{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598\nSyncing stream b_stream_name 0:00:00.882119"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as STARTED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.794,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"STARTED"}}} +{"type": "DEBUG", "message": "Syncing configured stream: c_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} +{"type": "DEBUG", "message": "Syncing stream instance: c_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} +{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} +{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: c_stream_name "}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=c_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"c_stream_name!A2:A5\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"969 m street\"\n ],\n [\n \"969\"\n ],\n [\n \"78\"\n ],\n [\n \"89 washington st\"\n ]\n ]\n }\n ]\n}\n"}} +{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} +{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as RUNNING"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122908677.1418,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"RUNNING"}}} +{"type":"RECORD","record":{"stream":"c_stream_name","data":{"range":"c_stream_name!A2:A5","majorDimension":"ROWS","values":[["969 m street"],["969"],["78"],["89 washington st"]]},"emitted_at":1734122908677}} +{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"c_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} +{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from c_stream_name stream"}} +{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as STOPPED"}} +{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122908677.347,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"COMPLETE"}}} +{"type":"LOG","log":{"level":"INFO","message":"Finished syncing c_stream_name"}} +{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598\nSyncing stream b_stream_name 0:00:00.882119\nSyncing stream c_stream_name 0:00:00.913683"}} +{"type":"LOG","log":{"level":"INFO","message":"Finished syncing SourceDynamicGoogleSheets"}} From 777daa5fd57ef916c122ba0fc0bdd3769f6a97bd Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 17 Dec 2024 19:01:48 -0600 Subject: [PATCH 04/63] source-google-sheets:" -m " - Add transformations to record selector in components resolver in order to get an indexed object of properties where index is the order. - Add partition router to retriver in components resolver so we can slice. --- .../source-google-sheets/poetry.lock | 31 ++-- .../source-google-sheets/pyproject.toml | 2 +- .../components/__init__.py | 3 +- .../components/extractors.py | 5 +- .../components/resolvers.py | 82 ---------- .../components/retrievers.py | 96 ------------ .../components/transformations.py | 34 ++++ .../components/transformers.py | 11 -- .../source_google_sheets/helpers_.py | 41 ----- .../source_google_sheets/manifest.yaml | 146 ++++++++++++++---- 10 files changed, 172 insertions(+), 279 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index fc04e246a165e..86bfb4366d59f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.9.2.dev4100" +version = "6.11.1.dev4100" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.9.2.dev4100-py3-none-any.whl", hash = "sha256:748efc1d969573234ab480829899d6f31d04a74207d70d73fc03e1202ee52c1d"}, - {file = "airbyte_cdk-6.9.2.dev4100.tar.gz", hash = "sha256:95deeb945a9f0d1039a6da50b315dd57109cb5e96247ad4235700fc8871af82f"}, + {file = "airbyte_cdk-6.11.1.dev4100-py3-none-any.whl", hash = "sha256:d24d229a98c9cc9075173a6a7e85baeaeaadad9012f25108edffcfaeb0cad642"}, + {file = "airbyte_cdk-6.11.1.dev4100.tar.gz", hash = "sha256:eafd439909e47178c7b3b967dcb589bb7de35392dccf303ab8133d6047054f58"}, ] [package.dependencies] @@ -116,19 +116,19 @@ files = [ [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -194,13 +194,13 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -564,13 +564,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.36.0" +version = "2.37.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.36.0-py2.py3-none-any.whl", hash = "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb"}, - {file = "google_auth-2.36.0.tar.gz", hash = "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"}, + {file = "google_auth-2.37.0-py2.py3-none-any.whl", hash = "sha256:42664f18290a6be591be5329a96fe30184be1a1badb7292a7f686a9659de9ca0"}, + {file = "google_auth-2.37.0.tar.gz", hash = "sha256:0054623abf1f9c83492c63d3f47e77f0a544caa3d40b2d98e099a611c2dd5d00"}, ] [package.dependencies] @@ -581,6 +581,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -2239,4 +2240,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "76e025f893ffaa8fd1c64656be066f7d90f9cd95d8c3c322364014bccd29505f" +content-hash = "f0888b5c419ee7828d8ee6c9190eab2a93ff2b7f3188ecca18cd851868767404" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 9a377ec98cf7e..fb0dd65972294 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = "6.9.2.dev4100" +airbyte-cdk = "6.11.1.dev04100" google-auth-httplib2 = "==0.2.0" Unidecode = "==1.3.8" google-api-python-client = "==2.114.0" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index 6414a8432bdbb..e5255914e2c29 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,4 +1,5 @@ from source_google_sheets.components.extractors import FieldMatchingExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter +from source_google_sheets.components.transformations import AddIndexedPropertiesFromList -__all__ = ["FieldMatchingExtractor", "RangePartitionRouter"] +__all__ = ["FieldMatchingExtractor", "RangePartitionRouter", "AddIndexedPropertiesFromList"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 2426d506c2e9c..56dfb0319a668 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -6,7 +6,6 @@ import requests from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor -from source_google_sheets.components.resolvers import resolve_fields_origin @dataclass @@ -44,7 +43,7 @@ class FieldMatchingExtractor(DpathExtractor): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self._values_to_match_key = parameters["values_to_match_key"] - self._stream_schema_ordered_properties = resolve_fields_origin(parameters, config=self.config) + self._properties_to_match = parameters["properties_to_match"] @staticmethod def match_properties_with_values(unmatched_values: List[str], ordered_properties: Dict[int, str]): @@ -63,4 +62,4 @@ def extract_records(self, response: requests.Response) -> Iterable[MutableMappin for raw_record in raw_records_extracted: unmatched_values_collection = raw_record[self._values_to_match_key] for unmatched_values in unmatched_values_collection: - yield from FieldMatchingExtractor.match_properties_with_values(unmatched_values, self._stream_schema_ordered_properties) + yield from FieldMatchingExtractor.match_properties_with_values(unmatched_values, self._properties_to_match) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py deleted file mode 100644 index 7fe106fa2e6a6..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/resolvers.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# -from typing import Any, Iterable, List, MutableMapping, Union - -import dpath -import requests -from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder -from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString -from airbyte_cdk.sources.declarative.models.declarative_component_schema import HttpRequester -from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ModelToComponentFactory -from source_google_sheets.helpers_ import Helpers - - -def _make_interpolated_path(provided_path, parameters): - interpolated_path = [InterpolatedString.create(path, parameters=parameters) for path in provided_path] - for path_index in range(len(interpolated_path)): - if isinstance(interpolated_path[path_index], str): - interpolated_path[path_index] = InterpolatedString.create(interpolated_path[path_index], parameters=parameters) - return interpolated_path - - -def create_requester_from_component_definition(component_definition, config): - factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False, disable_cache=False) - # sheet_headers_requester_definition = parameters.get("headers_requester") - sheet_headers_requester_name = component_definition.get("$parameters", {}).get("name", "") - sheet_headers_requester = factory_constructor.create_component( - model_type=HttpRequester, - component_definition=component_definition, - config=config, - name=sheet_headers_requester_name, - ) - if not sheet_headers_requester.use_cache: - raise Exception("Stream Schema ordered properties requester is required to use cache.") - return sheet_headers_requester - - -def _extract_records_by_path( - response: requests.Response, provided_path: List[Union[InterpolatedString, str]], config -) -> Iterable[MutableMapping[Any, Any]]: - for body in JsonDecoder({}).decode(response): - if len(provided_path) == 0: - extracted = body - else: - path = [path.eval(config) for path in provided_path] - if "*" in path: - extracted = dpath.values(body, path) - else: - extracted = dpath.get(body, path, default=[]) # type: ignore # extracted will be a MutableMapping, given input data structure - if isinstance(extracted, list): - yield from extracted - elif extracted: - yield extracted - else: - yield from [] - - -def request_schema_ordered_properties(sheet_headers_requester, parameters, config): - sheet_data_values_path = _make_interpolated_path(provided_path=parameters["sheet_data_values_path"], parameters=parameters) - sheet_headers = [] - response = sheet_headers_requester.send_request() - fields_to_match_key = parameters["fields_to_match_key"] - sheet_data_values = _extract_records_by_path(response, sheet_data_values_path, config) - for sheet_data_value in sheet_data_values: - schema_property_value = sheet_data_value[fields_to_match_key] - sheet_headers.append(schema_property_value) - - return Helpers.get_sheets_to_column_index_to_name(sheet_headers) - - -def resolve_fields_origin(parameters, config): - try: - fields_to_match_origin = parameters["fields_to_match_origin"] - except KeyError: - raise Exception("Missing required header requester parameter") - - if fields_to_match_origin.get("type") == "HttpRequester": - sheet_headers_requester = create_requester_from_component_definition(fields_to_match_origin, config) - stream_schema_ordered_properties = request_schema_ordered_properties(sheet_headers_requester, parameters, config) - return stream_schema_ordered_properties - else: - return fields_to_match_origin diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py deleted file mode 100644 index ef53ecdfd4963..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# -from dataclasses import dataclass -from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union - -import dpath -import requests -from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor -from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString -from airbyte_cdk.sources.declarative.models.declarative_component_schema import HttpRequester -from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ModelToComponentFactory -from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter -from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever -from airbyte_cdk.sources.types import StreamSlice -from source_google_sheets.helpers_ import Helpers - - -class RangeRetriever(SimpleRetriever): - parameters: Mapping[str, Any] - - # def __init__(self, **kwargs): - # super().__init__(**kwargs) - # factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False) - # parameters = kwargs.get("parameters") - # self.stream_slicer: StreamSlicer = RangePartitionRouter( - # parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) - # ) - # sheet_headers_requester_definition = parameters.get("sheet_headers_requester") - # sheet_headers_requester_name = sheet_headers_requester_definition.get("$parameters", {}).get("name", "") - # self.sheet_headers_requester = factory_constructor.create_component( - # model_type=HttpRequester, - # component_definition=sheet_headers_requester_definition, - # config=self.config, - # name=sheet_headers_requester_name, - # ) - - # def __post_init__(self, parameters: Mapping[str, Any]) -> None: - # super().__post_init__(parameters) - # factory_constructor = ModelToComponentFactory(emit_connector_builder_messages=False) - # # parameters = kwargs.get("parameters") - # self.stream_slicer: StreamSlicer = RangePartitionRouter( - # parameters={}, row_count=parameters.get("row_count", 0), batch_size=self.config.get("batch_size", 200) - # ) - # sheet_headers_requester_definition = parameters.get("sheet_headers_requester") - # sheet_headers_requester_name = sheet_headers_requester_definition.get("$parameters", {}).get("name", "") - # self.sheet_headers_requester = factory_constructor.create_component( - # model_type=HttpRequester, - # component_definition=sheet_headers_requester_definition, - # config=self.config, - # name=sheet_headers_requester_name, - # ) - - def stream_slices(self) -> Iterable[Optional[StreamSlice]]: # type: ignore - return self.stream_slicer.stream_slices() - - # - # def get_sheet_headers(self): - # sheet_headers = self.sheet_headers_requester.send_request() - # return sheet_headers - # - # def read_records( - # self, - # records_schema: Mapping[str, Any], - # stream_slice: Optional[StreamSlice] = None, - # ) -> Iterable[StreamData]: - # yield from super().read_records(records_schema=records_schema, stream_slice=stream_slice) - # - # def _parse_response( - # self, - # response: Optional[requests.Response], - # stream_state: StreamState, - # records_schema: Mapping[str, Any], - # stream_slice: Optional[StreamSlice] = None, - # next_page_token: Optional[Mapping[str, Any]] = None, - # ) -> Iterable[Record]: - # if not response: - # self._last_response = None - # yield from [] - # else: - # get_sheet_headers = self.get_sheet_headers() - # self._last_response = response - # # TODO: add something here or inside select records or record_slector - # # airbyte-integrations/connectors/source-google-sheets/.venv/lib/python3.10/site-packages/airbyte_cdk/sources/declarative/extractors/record_selector.py - # record_generator = self.record_selector.select_records( - # response=response, - # stream_state=stream_state, - # records_schema=records_schema, - # stream_slice=stream_slice, - # next_page_token=next_page_token, - # ) - # self._last_page_size = 0 - # for record in record_generator: - # self._last_page_size += 1 - # self._last_record = record - # yield record diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py new file mode 100644 index 0000000000000..d10c6d254362c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +from dataclasses import dataclass +from typing import Any, Dict, List, Mapping, Optional, Type, Union + +import dpath +from airbyte_cdk.sources.declarative.transformations.add_fields import AddFields +from airbyte_cdk.sources.types import Config, StreamSlice, StreamState + + +@dataclass +class AddIndexedPropertiesFromList(AddFields): + def __post_init__(self, parameters: Mapping[str, Any]) -> None: + super().__post_init__(parameters) + self._key_to_extract = parameters["key_to_extract"] + + def transform( + self, + record: Dict[str, Any], + config: Optional[Config] = None, + stream_state: Optional[StreamState] = None, + stream_slice: Optional[StreamSlice] = None, + ) -> None: + if config is None: + config = {} + kwargs = {"record": record, "stream_state": stream_state, "stream_slice": stream_slice} + for parsed_field in self._parsed_fields: + valid_types = (parsed_field.value_type,) if parsed_field.value_type else None + items_for_extraction = parsed_field.value.eval(config, valid_types=valid_types, **kwargs) + if not isinstance(items_for_extraction, list): + raise Exception("Transformation is expected to occur on a list.") + indexed_properties = { + index: item_for_extraction[self._key_to_extract] for index, item_for_extraction in enumerate(items_for_extraction) + } + dpath.new(record, parsed_field.path, indexed_properties) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py deleted file mode 100644 index db98fc74a3ae6..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformers.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. - - -# @dataclass -# class GoogleSheetRowsTransformation(RecordTransformation): -# def __init__(self) -> None: -# super().__init__() -# self.schema_requester = resolve_manifest(source=SourceDynamicGoogleSheets(None, None, None)).record.data["manifest"]["dynamic_streams"][0]["stream_template"]["retriever"]["requester"] -# -# def transform(self, record: MutableMapping[str, Any], **kwargs) -> MutableMapping[str, Any]: -# return record diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py deleted file mode 100644 index 91b301a62c752..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers_.py +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# - -import json -import logging -import re -from collections import defaultdict -from datetime import datetime -from typing import Dict, FrozenSet, Iterable, List, Tuple - -from airbyte_cdk.models.airbyte_protocol import AirbyteRecordMessage, AirbyteStream, ConfiguredAirbyteCatalog, SyncMode -from google.oauth2 import credentials as client_account -from google.oauth2 import service_account -from googleapiclient import discovery - -from .models.spreadsheet import RowData, Spreadsheet -from .utils import safe_name_conversion - -SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/drive.readonly"] - -logger = logging.getLogger("airbyte") - - -class Helpers(object): - @staticmethod - def get_sheets_to_column_index_to_name(first_row: List, names_conversion: bool = False) -> Dict[int, str]: - # todo: probably I should remove the sheet_id from the dictionary is redundant - sheets_to_column_index_to_name = {} - if names_conversion: - first_row = [safe_name_conversion(h) for h in first_row] - # When performing names conversion, they won't match what is listed in catalog for the majority of cases, - # so they should be cast here in order to have them in records - # columns = {safe_name_conversion(c) for c in columns} - # Find the column index of each header value - idx = 0 - for cell_value in first_row: - # if cell_value in columns: - sheets_to_column_index_to_name[idx] = cell_value - idx += 1 - return sheets_to_column_index_to_name diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index c5e7802ff7688..8308c6f3aac9f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -32,21 +32,8 @@ dynamic_streams: - valueRanges - "*" $parameters: - # We use these parameters to work with the response in the record selector - sheet_data_values_path: - ["sheets", "*", "data", "*", "rowData", "*", "values", "*"] - fields_to_match_key: "formattedValue" values_to_match_key: "values" - fields_to_match_origin: - $ref: "#/definitions/base_requester" - $parameters: - # Sheet id is provided by components_resolver - sheet_id: "" - name: "headers_requester" - http_method: GET - use_cache: True - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' - + properties_to_match: "" type: RecordSelector $parameters: name: "" @@ -93,23 +80,67 @@ dynamic_streams: paginator: type: NoPagination record_selector: + type: RecordSelector extractor: + type: DpathExtractor field_path: - sheets - - "*" - - properties - type: DpathExtractor - type: RecordSelector + transformations: + - type: AddFields + fields: + - path: + - properties + - values + value: "{{ record['data'][0]['rowData'][0]['values'] }}" + - type: RemoveFields + field_pointers: + - - data + - type: RemoveFields + field_pointers: + - - properties + - values + - "*" + - effectiveFormat + - type: RemoveFields + field_pointers: + - - properties + - values + - "*" + - userEnteredValue + - type: RemoveFields + field_pointers: + - - properties + - values + - "*" + - effectiveValue + - type: CustomTransformation + parameters: + key_to_extract: formattedValue + fields: + - path: + - properties + - indexed_properties_to_match + value: "{{ record['properties']['values'] }}" + class_name: source_google_sheets.components.AddIndexedPropertiesFromList + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: title + partition_field: sheet_id + stream: + $ref: "#/definitions/streams/sheets" requester: $ref: "#/definitions/base_requester" description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. http_method: GET - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json' + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json components_mapping: - field_path: - name type: ComponentMappingDefinition - value: "{{components_values['title']}}" + value: "{{components_values['properties']['title']}}" description: name for dynamic stream. - field_path: - schema_loader @@ -118,7 +149,7 @@ dynamic_streams: - $parameters - sheet_id type: ComponentMappingDefinition - value: "{{components_values['title']}}" + value: "{{components_values['properties']['title']}}" description: sheet_id for dynamic schema loader requester. - field_path: - retriever @@ -126,26 +157,24 @@ dynamic_streams: - $parameters - sheet_id type: ComponentMappingDefinition - value: "{{components_values['title']}}" + value: "{{components_values['properties']['title']}}" description: sheet_id for dynamic stream retriever requester. - field_path: - retriever - record_selector - extractor - $parameters - - fields_to_match_origin - - $parameters - - sheet_id + - properties_to_match type: ComponentMappingDefinition - value: "{{components_values['title']}}" - description: sheet_id for for extractor requester that will get correct order of record values. + value: "{{components_values['properties']['indexed_properties_to_match']}}" + description: indexed_schema to match with row values. - field_path: - retriever - partition_router - $parameters - row_count type: ComponentMappingDefinition - value: "{{components_values['gridProperties']['rowCount']}}" + value: "{{components_values['properties']['gridProperties']['rowCount']}}" description: rows count for dynamic stream partition router (slicer). - field_path: - retriever @@ -154,9 +183,32 @@ dynamic_streams: - batch_size type: ComponentMappingDefinition value: "{{config['batch_size']}}" - description: rows count for dynamic stream partition router (slicer). + description: batch size count for dynamic stream partition router (slicer). definitions: + streams: + sheets: + type: DeclarativeStream + name: sheets + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - sheets + - "*" + - properties + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/sheets" base_requester: type: HttpRequester url_base: https://sheets.googleapis.com/v4/spreadsheets/ @@ -178,3 +230,39 @@ definitions: authenticators: Client: "#/definitions/oauth_authenticator" Service: "#/definitions/bearer_authenticator" + +schemas: + sheets: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + gridProperties: + type: + - object + - "null" + properties: + columnCount: + type: + - number + - "null" + rowCount: + type: + - number + - "null" + index: + type: + - number + - "null" + sheetId: + type: + - number + - "null" + sheetType: + type: + - string + - "null" + title: + type: + - string + - "null" \ No newline at end of file From 9435c861a0496f2611382c78484e0cc405149fd0 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 17 Dec 2024 19:10:38 -0600 Subject: [PATCH 05/63] source-google-sheets: remove teste file --- .../test_read_with_partitions.jsonl | 84 ------------------- 1 file changed, 84 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl diff --git a/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl b/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl deleted file mode 100644 index 782158967c7ae..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/test_read_with_partitions.jsonl +++ /dev/null @@ -1,84 +0,0 @@ -{"type": "DEBUG", "message": "Debug logs enabled", "data": {}} -{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\"}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\", \"use_cache\": true}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=UTF-8', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Transfer-Encoding': 'chunked', 'Vary': 'Origin, X-Origin, Referer', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'x-l2-request-path': 'l2-managed-6'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"Starting syncing SourceDynamicGoogleSheets"}} -{"type": "DEBUG", "message": "declarative source created from parsed YAML manifest", "data": {"source_name": "SourceDynamicGoogleSheets", "path_to_yaml": "manifest.yaml", "parsed_config": "{\"version\": \"6.7.0\", \"type\": \"DeclarativeSource\", \"check\": {\"stream_names\": [], \"type\": \"CheckStream\"}, \"dynamic_streams\": [{\"type\": \"DynamicDeclarativeStream\", \"stream_template\": {\"name\": \"\", \"primary_key\": [], \"retriever\": {\"class_name\": \"source_google_sheets.components.RangeRetriever\", \"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"valueRanges\", \"*\"], \"type\": \"DpathExtractor\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"type\": \"RecordSelector\", \"name\": \"\", \"$parameters\": {\"name\": \"\"}}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}/values:batchGet?ranges={{parameters[\\\"sheet_id\\\"]}}!{{stream_partition.start_range}}:202&majorDimension=ROWS&alt=json\", \"sheet_id\": \"\", \"name\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"name\": \"\"}}, \"type\": \"CustomRetriever\"}, \"schema_loader\": {\"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"data\", \"*\", \"rowData\", \"*\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}, \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=true&ranges={{parameters[\\\"sheet_id\\\"]}}!1:1&alt=json\", \"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\", \"$parameters\": {\"sheet_id\": \"\", \"parsed_spreadsheet_id\": \"\"}}, \"type\": \"SimpleRetriever\"}, \"schema_type_identifier\": {\"key_pointer\": [\"formattedValue\"], \"schema_pointer\": [\"values\"]}, \"type\": \"DynamicSchemaLoader\"}, \"type\": \"DeclarativeStream\"}, \"components_resolver\": {\"components_mapping\": [{\"field_path\": [\"name\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}, {\"field_path\": [\"schema_loader\", \"retriever\", \"requester\", \"$parameters\", \"sheet_id\"], \"type\": \"ComponentMappingDefinition\", \"value\": \"{{components_values['title']}}\"}], \"retriever\": {\"paginator\": {\"type\": \"NoPagination\"}, \"record_selector\": {\"extractor\": {\"field_path\": [\"sheets\", \"*\", \"properties\"], \"type\": \"DpathExtractor\"}, \"type\": \"RecordSelector\"}, \"requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}, \"http_method\": \"GET\", \"path\": \"{% if config[\\\"spreadsheet_id\\\"] | regex_search(\\\"^(https://.*)\\\") %}{{ config[\\\"spreadsheet_id\\\"] | regex_search(\\\"/([-\\\\\\\\w]{20,})([/]?)\\\") }}{% else %}{{ config[\\\"spreadsheet_id\\\"] }}{% endif %}?includeGridData=false&alt=json\", \"use_cache\": true}, \"type\": \"SimpleRetriever\"}, \"type\": \"HttpComponentsResolver\"}}], \"definitions\": {\"base_requester\": {\"type\": \"HttpRequester\", \"url_base\": \"https://sheets.googleapis.com/v4/spreadsheets/\", \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}, \"bearer_authenticator\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}, \"oauth_authenticator\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"authenticator\": {\"type\": \"SelectiveAuthenticator\", \"authenticator_selection_path\": [\"credentials\", \"auth_type\"], \"authenticators\": {\"Client\": {\"type\": \"OAuthAuthenticator\", \"refresh_request_body\": {}, \"token_refresh_endpoint\": \"https://www.googleapis.com/oauth2/v4/token\", \"grant_type\": \"refresh_token\", \"client_id\": \"{{ config[\\\"credentials\\\"][\\\"client_id\\\"] }}\", \"client_secret\": \"{{ config[\\\"credentials\\\"][\\\"client_secret\\\"] }}\", \"refresh_token\": \"{{ config[\\\"credentials\\\"][\\\"refresh_token\\\"] }}\"}, \"Service\": {\"type\": \"BearerAuthenticator\", \"api_token\": \"{{ config['credentials']['access_token'] }}\"}}}}}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=false&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json; charset=UTF-8', 'Date': 'Fri, 13 Dec 2024 20:48:25 GMT', 'Server': 'ESF', 'Transfer-Encoding': 'chunked', 'Vary': 'Origin, X-Origin, Referer', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'x-l2-request-path': 'l2-managed-6'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n }\n },\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n }\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as STARTED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906027.854,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"STARTED"}}} -{"type": "DEBUG", "message": "Syncing configured stream: a_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} -{"type": "DEBUG", "message": "Syncing stream instance: a_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} -{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} -{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: a_stream_name "}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=a_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"a_stream_name!A2:B4\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"name1\",\n \"22\"\n ],\n [\n \"name2\",\n \"24\"\n ],\n [\n \"name3\",\n \"25\"\n ]\n ]\n }\n ]\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=a_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:26 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 0,\n \"title\": \"a_stream_name\",\n \"index\": 0,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 4,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"age\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"age\"\n },\n \"formattedValue\": \"age\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as RUNNING"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.1719,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"RUNNING"}}} -{"type":"RECORD","record":{"stream":"a_stream_name","data":{"range":"a_stream_name!A2:B4","majorDimension":"ROWS","values":[["name1","22"],["name2","24"],["name3","25"]]},"emitted_at":1734122906881}} -{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"a_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} -{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from a_stream_name stream"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream a_stream_name as STOPPED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.3428,"stream_status":{"stream_descriptor":{"name":"a_stream_name"},"status":"COMPLETE"}}} -{"type":"LOG","log":{"level":"INFO","message":"Finished syncing a_stream_name"}} -{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as STARTED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122906881.429,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"STARTED"}}} -{"type": "DEBUG", "message": "Syncing configured stream: b_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} -{"type": "DEBUG", "message": "Syncing stream instance: b_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} -{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} -{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: b_stream_name "}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=b_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"b_stream_name!A2:B3\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"name1\",\n \"name1@fake.com\"\n ],\n [\n \"name2\",\n \"name2@fake.com\"\n ]\n ]\n }\n ]\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=b_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:27 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1855086503,\n \"title\": \"b_stream_name\",\n \"index\": 1,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 3,\n \"columnCount\": 2\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"name\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"name\"\n },\n \"formattedValue\": \"name\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n },\n {\n \"userEnteredValue\": {\n \"stringValue\": \"email\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"email\"\n },\n \"formattedValue\": \"email\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n },\n {\n \"pixelSize\": 129\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as RUNNING"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.23,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"RUNNING"}}} -{"type":"RECORD","record":{"stream":"b_stream_name","data":{"range":"b_stream_name!A2:B3","majorDimension":"ROWS","values":[["name1","name1@fake.com"],["name2","name2@fake.com"]]},"emitted_at":1734122907763}} -{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"b_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} -{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from b_stream_name stream"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream b_stream_name as STOPPED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.5,"stream_status":{"stream_descriptor":{"name":"b_stream_name"},"status":"COMPLETE"}}} -{"type":"LOG","log":{"level":"INFO","message":"Finished syncing b_stream_name"}} -{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598\nSyncing stream b_stream_name 0:00:00.882119"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as STARTED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122907763.794,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"STARTED"}}} -{"type": "DEBUG", "message": "Syncing configured stream: c_stream_name", "data": {"sync_mode": "SyncMode.full_refresh", "cursor_field": "None", "primary_key": "None"}} -{"type": "DEBUG", "message": "Syncing stream instance: c_stream_name", "data": {"cursor_field": "[]", "primary_key": "[]"}} -{"type":"LOG","log":{"level":"INFO","message":"Setting state of SourceDynamicGoogleSheets stream to {}"}} -{"type":"LOG","log":{"level":"INFO","message":"Syncing stream: c_stream_name "}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"slice:{\"start_range\": 2, \"end_range\": 202}"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/values:batchGet?ranges=c_stream_name!2:202&majorDimension=ROWS&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"valueRanges\": [\n {\n \"range\": \"c_stream_name!A2:A5\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"969 m street\"\n ],\n [\n \"969\"\n ],\n [\n \"78\"\n ],\n [\n \"89 washington st\"\n ]\n ]\n }\n ]\n}\n"}} -{"type": "DEBUG", "message": "Making outbound API request", "data": {"request_body": "None", "url": "https://sheets.googleapis.com/v4/spreadsheets/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw?includeGridData=true&ranges=c_stream_name!1:1&alt=json", "headers": "{'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer ****'}"}} -{"type": "DEBUG", "message": "Receiving response", "data": {"headers": "{'Content-Type': 'application/json; charset=UTF-8', 'Vary': 'Origin, X-Origin, Referer', 'Content-Encoding': 'gzip', 'Date': 'Fri, 13 Dec 2024 20:48:28 GMT', 'Server': 'ESF', 'Cache-Control': 'private', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'x-l2-request-path': 'l2-managed-6', 'Transfer-Encoding': 'chunked'}", "status": "200", "body": "{\n \"spreadsheetId\": \"19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw\",\n \"properties\": {\n \"title\": \"a_spreadsheet_id\",\n \"locale\": \"en_US\",\n \"autoRecalc\": \"ON_CHANGE\",\n \"timeZone\": \"America/Mexico_City\",\n \"defaultFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"arial,sans,sans-serif\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"spreadsheetTheme\": {\n \"primaryFontFamily\": \"Arial\",\n \"themeColors\": [\n {\n \"colorType\": \"TEXT\",\n \"color\": {\n \"rgbColor\": {}\n }\n },\n {\n \"colorType\": \"BACKGROUND\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n {\n \"colorType\": \"ACCENT1\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.25882354,\n \"green\": 0.52156866,\n \"blue\": 0.95686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT2\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.91764706,\n \"green\": 0.2627451,\n \"blue\": 0.20784314\n }\n }\n },\n {\n \"colorType\": \"ACCENT3\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.9843137,\n \"green\": 0.7372549,\n \"blue\": 0.015686275\n }\n }\n },\n {\n \"colorType\": \"ACCENT4\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.20392157,\n \"green\": 0.65882355,\n \"blue\": 0.3254902\n }\n }\n },\n {\n \"colorType\": \"ACCENT5\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 0.42745098,\n \"blue\": 0.003921569\n }\n }\n },\n {\n \"colorType\": \"ACCENT6\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.27450982,\n \"green\": 0.7411765,\n \"blue\": 0.7764706\n }\n }\n },\n {\n \"colorType\": \"LINK\",\n \"color\": {\n \"rgbColor\": {\n \"red\": 0.06666667,\n \"green\": 0.33333334,\n \"blue\": 0.8\n }\n }\n }\n ]\n }\n },\n \"sheets\": [\n {\n \"properties\": {\n \"sheetId\": 1295940323,\n \"title\": \"c_stream_name\",\n \"index\": 2,\n \"sheetType\": \"GRID\",\n \"gridProperties\": {\n \"rowCount\": 5,\n \"columnCount\": 1\n }\n },\n \"data\": [\n {\n \"rowData\": [\n {\n \"values\": [\n {\n \"userEnteredValue\": {\n \"stringValue\": \"address\"\n },\n \"effectiveValue\": {\n \"stringValue\": \"address\"\n },\n \"formattedValue\": \"address\",\n \"effectiveFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n },\n \"padding\": {\n \"top\": 2,\n \"right\": 3,\n \"bottom\": 2,\n \"left\": 3\n },\n \"horizontalAlignment\": \"LEFT\",\n \"verticalAlignment\": \"BOTTOM\",\n \"wrapStrategy\": \"OVERFLOW_CELL\",\n \"textFormat\": {\n \"foregroundColor\": {},\n \"fontFamily\": \"Arial\",\n \"fontSize\": 10,\n \"bold\": false,\n \"italic\": false,\n \"strikethrough\": false,\n \"underline\": false,\n \"foregroundColorStyle\": {\n \"rgbColor\": {}\n }\n },\n \"hyperlinkDisplayType\": \"PLAIN_TEXT\",\n \"backgroundColorStyle\": {\n \"rgbColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n }\n }\n ]\n }\n ],\n \"rowMetadata\": [\n {\n \"pixelSize\": 21\n }\n ],\n \"columnMetadata\": [\n {\n \"pixelSize\": 100\n }\n ]\n }\n ]\n }\n ],\n \"spreadsheetUrl\": \"https://docs.google.com/spreadsheets/d/19gOzIckDX7AB8E7Ikts6KAxNrk3ZGSjLbnkYxxM_HLw/edit?ouid=106175843115957165976\"\n}\n"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as RUNNING"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122908677.1418,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"RUNNING"}}} -{"type":"RECORD","record":{"stream":"c_stream_name","data":{"range":"c_stream_name!A2:A5","majorDimension":"ROWS","values":[["969 m street"],["969"],["78"],["89 washington st"]]},"emitted_at":1734122908677}} -{"type":"STATE","state":{"type":"STREAM","stream":{"stream_descriptor":{"name":"c_stream_name"},"stream_state":{"__ab_no_cursor_state_message":true}},"sourceStats":{"recordCount":1.0}}} -{"type":"LOG","log":{"level":"INFO","message":"Read 1 records from c_stream_name stream"}} -{"type":"LOG","log":{"level":"INFO","message":"Marking stream c_stream_name as STOPPED"}} -{"type":"TRACE","trace":{"type":"STREAM_STATUS","emitted_at":1734122908677.347,"stream_status":{"stream_descriptor":{"name":"c_stream_name"},"status":"COMPLETE"}}} -{"type":"LOG","log":{"level":"INFO","message":"Finished syncing c_stream_name"}} -{"type":"LOG","log":{"level":"INFO","message":"SourceDynamicGoogleSheets runtimes:\nSyncing stream a_stream_name 0:00:00.853598\nSyncing stream b_stream_name 0:00:00.882119\nSyncing stream c_stream_name 0:00:00.913683"}} -{"type":"LOG","log":{"level":"INFO","message":"Finished syncing SourceDynamicGoogleSheets"}} From 624d6710a9b64155c676e545014ae5ff62d64e96 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 18 Dec 2024 11:23:35 -0600 Subject: [PATCH 06/63] source-google-sheets: - Remove old SourceClass to temp file to be deleted and - Remove unused transformations - Make extractor ha transform data from component mapping --- .../components/__init__.py | 3 +- .../components/extractors.py | 10 +- .../components/transformations.py | 34 --- .../source_google_sheets/manifest.yaml | 40 +-- .../source_google_sheets/run.py | 10 +- .../source_google_sheets/source.py | 284 +----------------- .../source_google_sheets/source_.py | 277 +++++++++++++++++ .../source_google_sheets/source_dymamic.py | 21 -- 8 files changed, 308 insertions(+), 371 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index e5255914e2c29..6414a8432bdbb 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,5 +1,4 @@ from source_google_sheets.components.extractors import FieldMatchingExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter -from source_google_sheets.components.transformations import AddIndexedPropertiesFromList -__all__ = ["FieldMatchingExtractor", "RangePartitionRouter", "AddIndexedPropertiesFromList"] +__all__ = ["FieldMatchingExtractor", "RangePartitionRouter"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 56dfb0319a668..d690f8375c7d5 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -43,7 +43,15 @@ class FieldMatchingExtractor(DpathExtractor): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self._values_to_match_key = parameters["values_to_match_key"] - self._properties_to_match = parameters["properties_to_match"] + property_to_match_key = parameters["property_to_match_key"] + self._properties_to_match = FieldMatchingExtractor.extract_properties_to_match(parameters["properties_to_match"], property_to_match_key) + + @staticmethod + def extract_properties_to_match(properties_to_match, property_to_match_key): + indexed_properties = { + index: item_for_match[property_to_match_key] for index, item_for_match in enumerate(properties_to_match) + } + return indexed_properties @staticmethod def match_properties_with_values(unmatched_values: List[str], ordered_properties: Dict[int, str]): diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py deleted file mode 100644 index d10c6d254362c..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/transformations.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -from dataclasses import dataclass -from typing import Any, Dict, List, Mapping, Optional, Type, Union - -import dpath -from airbyte_cdk.sources.declarative.transformations.add_fields import AddFields -from airbyte_cdk.sources.types import Config, StreamSlice, StreamState - - -@dataclass -class AddIndexedPropertiesFromList(AddFields): - def __post_init__(self, parameters: Mapping[str, Any]) -> None: - super().__post_init__(parameters) - self._key_to_extract = parameters["key_to_extract"] - - def transform( - self, - record: Dict[str, Any], - config: Optional[Config] = None, - stream_state: Optional[StreamState] = None, - stream_slice: Optional[StreamSlice] = None, - ) -> None: - if config is None: - config = {} - kwargs = {"record": record, "stream_state": stream_state, "stream_slice": stream_slice} - for parsed_field in self._parsed_fields: - valid_types = (parsed_field.value_type,) if parsed_field.value_type else None - items_for_extraction = parsed_field.value.eval(config, valid_types=valid_types, **kwargs) - if not isinstance(items_for_extraction, list): - raise Exception("Transformation is expected to occur on a list.") - indexed_properties = { - index: item_for_extraction[self._key_to_extract] for index, item_for_extraction in enumerate(items_for_extraction) - } - dpath.new(record, parsed_field.path, indexed_properties) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 8308c6f3aac9f..a48185c4235fc 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -32,6 +32,7 @@ dynamic_streams: - valueRanges - "*" $parameters: + property_to_match_key: "formattedValue" values_to_match_key: "values" properties_to_match: "" type: RecordSelector @@ -85,43 +86,6 @@ dynamic_streams: type: DpathExtractor field_path: - sheets - transformations: - - type: AddFields - fields: - - path: - - properties - - values - value: "{{ record['data'][0]['rowData'][0]['values'] }}" - - type: RemoveFields - field_pointers: - - - data - - type: RemoveFields - field_pointers: - - - properties - - values - - "*" - - effectiveFormat - - type: RemoveFields - field_pointers: - - - properties - - values - - "*" - - userEnteredValue - - type: RemoveFields - field_pointers: - - - properties - - values - - "*" - - effectiveValue - - type: CustomTransformation - parameters: - key_to_extract: formattedValue - fields: - - path: - - properties - - indexed_properties_to_match - value: "{{ record['properties']['values'] }}" - class_name: source_google_sheets.components.AddIndexedPropertiesFromList partition_router: type: SubstreamPartitionRouter parent_stream_configs: @@ -166,7 +130,7 @@ dynamic_streams: - $parameters - properties_to_match type: ComponentMappingDefinition - value: "{{components_values['properties']['indexed_properties_to_match']}}" + value: "{{components_values['data'][0]['rowData'][0]['values']}}" description: indexed_schema to match with row values. - field_path: - retriever diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index 54e7ed54591a3..3b7a158fb21e0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -11,7 +11,7 @@ from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type from orjson import orjson -from source_google_sheets.source_dymamic import SourceDynamicGoogleSheets +from source_google_sheets.source import SourceGoogleSheets def _get_source(args: List[str]): @@ -19,10 +19,10 @@ def _get_source(args: List[str]): config_path = AirbyteEntrypoint.extract_config(args) state_path = AirbyteEntrypoint.extract_state(args) try: - return SourceDynamicGoogleSheets( - SourceDynamicGoogleSheets.read_catalog(catalog_path) if catalog_path else None, - SourceDynamicGoogleSheets.read_config(config_path) if config_path else None, - SourceDynamicGoogleSheets.read_state(state_path) if state_path else None, + return SourceGoogleSheets( + SourceGoogleSheets.read_catalog(catalog_path) if catalog_path else None, + SourceGoogleSheets.read_config(config_path) if config_path else None, + SourceGoogleSheets.read_state(state_path) if state_path else None, ) except Exception as error: print( diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index eae6e37761231..18219ac7f9a08 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -1,277 +1,21 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. # +from typing import Any, Mapping, Optional -import json -import logging -import socket -from typing import Any, Generator, List, Mapping, MutableMapping, Optional, Union +from airbyte_cdk.models import ConfiguredAirbyteCatalog +from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource +from airbyte_cdk.sources.source import TState -from airbyte_cdk.models import FailureType -from airbyte_cdk.models.airbyte_protocol import ( - AirbyteCatalog, - AirbyteConnectionStatus, - AirbyteMessage, - AirbyteStateMessage, - AirbyteStreamStatus, - ConfiguredAirbyteCatalog, - Status, - Type, -) -from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager -from airbyte_cdk.sources.source import Source -from airbyte_cdk.sources.streams.checkpoint import FullRefreshCheckpointReader -from airbyte_cdk.utils import AirbyteTracedException -from airbyte_cdk.utils.stream_status_utils import as_airbyte_message -from apiclient import errors -from google.auth import exceptions as google_exceptions -from requests.status_codes import codes as status_codes +""" +This file provides the necessary constructs to interpret a provided declarative YAML configuration file into +source connector. +WARNING: Do not modify this file. +""" -from .client import GoogleSheetsClient -from .helpers import Helpers -from .models.spreadsheet import Spreadsheet -from .models.spreadsheet_values import SpreadsheetValues -from .utils import exception_description_by_status_code, safe_name_conversion -# override default socket timeout to be 10 mins instead of 60 sec. -# on behalf of https://github.com/airbytehq/oncall/issues/242 -DEFAULT_SOCKET_TIMEOUT: int = 600 -socket.setdefaulttimeout(DEFAULT_SOCKET_TIMEOUT) - - -class SourceGoogleSheets(Source): - """ - Spreadsheets API Reference: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets - """ - - def check(self, logger: logging.Logger, config: json) -> AirbyteConnectionStatus: - # Check involves verifying that the specified spreadsheet is reachable with our credentials. - try: - client = GoogleSheetsClient(self.get_credentials(config)) - except Exception as e: - return AirbyteConnectionStatus(status=Status.FAILED, message=f"Please use valid credentials json file. Error: {e}") - - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - - try: - spreadsheet = client.get(spreadsheetId=spreadsheet_id, includeGridData=False) - except errors.HttpError as err: - message = "Config error: " - # Give a clearer message if it's a common error like 404. - if err.resp.status == status_codes.NOT_FOUND: - message += "The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - except google_exceptions.GoogleAuthError as err: - message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - - # Check for duplicate headers - spreadsheet_metadata = Spreadsheet.parse_obj(spreadsheet) - grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) - - duplicate_headers_in_sheet = {} - for sheet_name in grid_sheets: - try: - header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) - if config.get("names_conversion"): - header_row_data = [safe_name_conversion(h) for h in header_row_data] - _, duplicate_headers = Helpers.get_valid_headers_and_duplicates(header_row_data) - if duplicate_headers: - duplicate_headers_in_sheet[sheet_name] = duplicate_headers - except Exception as err: - if str(err).startswith("Expected data for exactly one row for sheet"): - logger.warn(f"Skip empty sheet: {sheet_name}") - else: - logger.error(str(err)) - return AirbyteConnectionStatus( - status=Status.FAILED, message=f"Unable to read the schema of sheet {sheet_name}. Error: {str(err)}" - ) - if duplicate_headers_in_sheet: - duplicate_headers_error_message = ", ".join( - [ - f"[sheet:{sheet_name}, headers:{duplicate_sheet_headers}]" - for sheet_name, duplicate_sheet_headers in duplicate_headers_in_sheet.items() - ] - ) - return AirbyteConnectionStatus( - status=Status.FAILED, - message="The following duplicate headers were found in the following sheets. Please fix them to continue: " - + duplicate_headers_error_message, - ) - - return AirbyteConnectionStatus(status=Status.SUCCEEDED) - - def discover(self, logger: logging.Logger, config: json) -> AirbyteCatalog: - client = GoogleSheetsClient(self.get_credentials(config)) - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - try: - logger.info(f"Running discovery on sheet {spreadsheet_id}") - spreadsheet_metadata = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=False)) - grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) - streams = [] - for sheet_name in grid_sheets: - try: - header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) - if config.get("names_conversion"): - header_row_data = [safe_name_conversion(h) for h in header_row_data] - stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_row_data) - streams.append(stream) - except Exception as err: - if str(err).startswith("Expected data for exactly one row for sheet"): - logger.warn(f"Skip empty sheet: {sheet_name}") - else: - logger.error(str(err)) - return AirbyteCatalog(streams=streams) - - except errors.HttpError as err: - error_description = exception_description_by_status_code(err.resp.status, spreadsheet_id) - config_error_status_codes = [status_codes.NOT_FOUND, status_codes.FORBIDDEN] - if err.resp.status in config_error_status_codes: - message = f"{error_description}. {err.reason}." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - raise Exception(f"Could not discover the schema of your spreadsheet. {error_description}. {err.reason}.") - except google_exceptions.GoogleAuthError as err: - message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - - def _read( - self, - logger: logging.Logger, - config: json, - catalog: ConfiguredAirbyteCatalog, - state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, - ) -> Generator[AirbyteMessage, None, None]: - client = GoogleSheetsClient(self.get_credentials(config)) - client.Backoff.row_batch_size = config.get("batch_size", 200) - - sheet_to_column_name = Helpers.parse_sheet_and_column_names_from_catalog(catalog) - stream_instances = {s.stream.name: s.stream for s in catalog.streams} - state_manager = ConnectorStateManager(stream_instance_map=stream_instances, state=state or {}) - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - - logger.info(f"Starting syncing spreadsheet {spreadsheet_id}") - # For each sheet in the spreadsheet, get a batch of rows, and as long as there hasn't been - # a blank row, emit the row batch - sheet_to_column_index_to_name = Helpers.get_available_sheets_to_column_index_to_name( - client, spreadsheet_id, sheet_to_column_name, config.get("names_conversion") - ) - sheet_row_counts = Helpers.get_sheet_row_count(client, spreadsheet_id) - logger.info(f"Row counts: {sheet_row_counts}") - for sheet in sheet_to_column_index_to_name.keys(): - logger.info(f"Syncing sheet {sheet}") - stream = stream_instances.get(sheet) - yield as_airbyte_message(stream, AirbyteStreamStatus.STARTED) - checkpoint_reader = FullRefreshCheckpointReader([]) - _ = checkpoint_reader.next() - # We revalidate the sheet here to avoid errors in case the sheet was changed after the sync started - is_valid, reason = Helpers.check_sheet_is_valid(client, spreadsheet_id, sheet) - if not is_valid: - logger.info(f"Skipping syncing sheet {sheet}: {reason}") - yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) - yield as_airbyte_message(stream, AirbyteStreamStatus.INCOMPLETE) - continue - - column_index_to_name = sheet_to_column_index_to_name[sheet] - row_cursor = 2 # we start syncing past the header row - # For the loop, it is necessary that the initial row exists when we send a request to the API, - # if the last row of the interval goes outside the sheet - this is normal, we will return - # only the real data of the sheet and in the next iteration we will loop out. - while row_cursor <= sheet_row_counts[sheet]: - row_batch = SpreadsheetValues.parse_obj( - client.get_values( - sheet=sheet, - row_cursor=row_cursor, - spreadsheetId=spreadsheet_id, - majorDimension="ROWS", - ) - ) - - row_cursor += client.Backoff.row_batch_size + 1 - # there should always be one range since we requested only one - value_ranges = row_batch.valueRanges[0] - - if not value_ranges.values: - break - - row_values = value_ranges.values - if len(row_values) == 0: - break - - yield as_airbyte_message(stream, AirbyteStreamStatus.RUNNING) - for row in row_values: - if not Helpers.is_row_empty(row) and Helpers.row_contains_relevant_data(row, column_index_to_name.keys()): - yield AirbyteMessage(type=Type.RECORD, record=Helpers.row_data_to_record_message(sheet, row, column_index_to_name)) - - yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) - yield as_airbyte_message(stream, AirbyteStreamStatus.COMPLETE) - - def _checkpoint_state( - self, - stream_state: Mapping[str, Any], - state_manager, - stream_name: str, - stream_namespace: Optional[str], - ) -> AirbyteMessage: - state_manager.update_state_for_stream(stream_name, stream_namespace, stream_state) - return state_manager.create_state_message(stream_name, stream_namespace) - - def read( - self, - logger: logging.Logger, - config: json, - catalog: ConfiguredAirbyteCatalog, - state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, - ) -> Generator[AirbyteMessage, None, None]: - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - try: - yield from self._read(logger, config, catalog, state) - except errors.HttpError as e: - error_description = exception_description_by_status_code(e.status_code, spreadsheet_id) - - if e.status_code == status_codes.FORBIDDEN: - raise AirbyteTracedException( - message=f"Stopped syncing process. {error_description}", - internal_message=error_description, - failure_type=FailureType.config_error, - ) from e - if e.status_code == status_codes.TOO_MANY_REQUESTS: - raise AirbyteTracedException( - message=f"Stopped syncing process due to rate limits. {error_description}", - internal_message=error_description, - failure_type=FailureType.transient_error, - ) from e - else: - logger.info(f"{e.status_code}: {e.reason}. {error_description}") - raise AirbyteTracedException( - message=f"Stopped syncing process. {error_description}", - internal_message=error_description, - failure_type=FailureType.transient_error, - ) from e - finally: - logger.info(f"Finished syncing spreadsheet {spreadsheet_id}") - - @staticmethod - def get_credentials(config): - # backward compatible with old style config - if config.get("credentials_json"): - credentials = {"auth_type": "Service", "service_account_info": config.get("credentials_json")} - return credentials - - return config.get("credentials") +# Declarative Source +class SourceGoogleSheets(YamlDeclarativeSource): + def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): + super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py new file mode 100644 index 0000000000000..eae6e37761231 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py @@ -0,0 +1,277 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import json +import logging +import socket +from typing import Any, Generator, List, Mapping, MutableMapping, Optional, Union + +from airbyte_cdk.models import FailureType +from airbyte_cdk.models.airbyte_protocol import ( + AirbyteCatalog, + AirbyteConnectionStatus, + AirbyteMessage, + AirbyteStateMessage, + AirbyteStreamStatus, + ConfiguredAirbyteCatalog, + Status, + Type, +) +from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager +from airbyte_cdk.sources.source import Source +from airbyte_cdk.sources.streams.checkpoint import FullRefreshCheckpointReader +from airbyte_cdk.utils import AirbyteTracedException +from airbyte_cdk.utils.stream_status_utils import as_airbyte_message +from apiclient import errors +from google.auth import exceptions as google_exceptions +from requests.status_codes import codes as status_codes + +from .client import GoogleSheetsClient +from .helpers import Helpers +from .models.spreadsheet import Spreadsheet +from .models.spreadsheet_values import SpreadsheetValues +from .utils import exception_description_by_status_code, safe_name_conversion + +# override default socket timeout to be 10 mins instead of 60 sec. +# on behalf of https://github.com/airbytehq/oncall/issues/242 +DEFAULT_SOCKET_TIMEOUT: int = 600 +socket.setdefaulttimeout(DEFAULT_SOCKET_TIMEOUT) + + +class SourceGoogleSheets(Source): + """ + Spreadsheets API Reference: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets + """ + + def check(self, logger: logging.Logger, config: json) -> AirbyteConnectionStatus: + # Check involves verifying that the specified spreadsheet is reachable with our credentials. + try: + client = GoogleSheetsClient(self.get_credentials(config)) + except Exception as e: + return AirbyteConnectionStatus(status=Status.FAILED, message=f"Please use valid credentials json file. Error: {e}") + + spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) + + try: + spreadsheet = client.get(spreadsheetId=spreadsheet_id, includeGridData=False) + except errors.HttpError as err: + message = "Config error: " + # Give a clearer message if it's a common error like 404. + if err.resp.status == status_codes.NOT_FOUND: + message += "The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync." + raise AirbyteTracedException( + message=message, + internal_message=message, + failure_type=FailureType.config_error, + ) from err + except google_exceptions.GoogleAuthError as err: + message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." + raise AirbyteTracedException( + message=message, + internal_message=message, + failure_type=FailureType.config_error, + ) from err + + # Check for duplicate headers + spreadsheet_metadata = Spreadsheet.parse_obj(spreadsheet) + grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) + + duplicate_headers_in_sheet = {} + for sheet_name in grid_sheets: + try: + header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) + if config.get("names_conversion"): + header_row_data = [safe_name_conversion(h) for h in header_row_data] + _, duplicate_headers = Helpers.get_valid_headers_and_duplicates(header_row_data) + if duplicate_headers: + duplicate_headers_in_sheet[sheet_name] = duplicate_headers + except Exception as err: + if str(err).startswith("Expected data for exactly one row for sheet"): + logger.warn(f"Skip empty sheet: {sheet_name}") + else: + logger.error(str(err)) + return AirbyteConnectionStatus( + status=Status.FAILED, message=f"Unable to read the schema of sheet {sheet_name}. Error: {str(err)}" + ) + if duplicate_headers_in_sheet: + duplicate_headers_error_message = ", ".join( + [ + f"[sheet:{sheet_name}, headers:{duplicate_sheet_headers}]" + for sheet_name, duplicate_sheet_headers in duplicate_headers_in_sheet.items() + ] + ) + return AirbyteConnectionStatus( + status=Status.FAILED, + message="The following duplicate headers were found in the following sheets. Please fix them to continue: " + + duplicate_headers_error_message, + ) + + return AirbyteConnectionStatus(status=Status.SUCCEEDED) + + def discover(self, logger: logging.Logger, config: json) -> AirbyteCatalog: + client = GoogleSheetsClient(self.get_credentials(config)) + spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) + try: + logger.info(f"Running discovery on sheet {spreadsheet_id}") + spreadsheet_metadata = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=False)) + grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) + streams = [] + for sheet_name in grid_sheets: + try: + header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) + if config.get("names_conversion"): + header_row_data = [safe_name_conversion(h) for h in header_row_data] + stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_row_data) + streams.append(stream) + except Exception as err: + if str(err).startswith("Expected data for exactly one row for sheet"): + logger.warn(f"Skip empty sheet: {sheet_name}") + else: + logger.error(str(err)) + return AirbyteCatalog(streams=streams) + + except errors.HttpError as err: + error_description = exception_description_by_status_code(err.resp.status, spreadsheet_id) + config_error_status_codes = [status_codes.NOT_FOUND, status_codes.FORBIDDEN] + if err.resp.status in config_error_status_codes: + message = f"{error_description}. {err.reason}." + raise AirbyteTracedException( + message=message, + internal_message=message, + failure_type=FailureType.config_error, + ) from err + raise Exception(f"Could not discover the schema of your spreadsheet. {error_description}. {err.reason}.") + except google_exceptions.GoogleAuthError as err: + message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." + raise AirbyteTracedException( + message=message, + internal_message=message, + failure_type=FailureType.config_error, + ) from err + + def _read( + self, + logger: logging.Logger, + config: json, + catalog: ConfiguredAirbyteCatalog, + state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, + ) -> Generator[AirbyteMessage, None, None]: + client = GoogleSheetsClient(self.get_credentials(config)) + client.Backoff.row_batch_size = config.get("batch_size", 200) + + sheet_to_column_name = Helpers.parse_sheet_and_column_names_from_catalog(catalog) + stream_instances = {s.stream.name: s.stream for s in catalog.streams} + state_manager = ConnectorStateManager(stream_instance_map=stream_instances, state=state or {}) + spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) + + logger.info(f"Starting syncing spreadsheet {spreadsheet_id}") + # For each sheet in the spreadsheet, get a batch of rows, and as long as there hasn't been + # a blank row, emit the row batch + sheet_to_column_index_to_name = Helpers.get_available_sheets_to_column_index_to_name( + client, spreadsheet_id, sheet_to_column_name, config.get("names_conversion") + ) + sheet_row_counts = Helpers.get_sheet_row_count(client, spreadsheet_id) + logger.info(f"Row counts: {sheet_row_counts}") + for sheet in sheet_to_column_index_to_name.keys(): + logger.info(f"Syncing sheet {sheet}") + stream = stream_instances.get(sheet) + yield as_airbyte_message(stream, AirbyteStreamStatus.STARTED) + checkpoint_reader = FullRefreshCheckpointReader([]) + _ = checkpoint_reader.next() + # We revalidate the sheet here to avoid errors in case the sheet was changed after the sync started + is_valid, reason = Helpers.check_sheet_is_valid(client, spreadsheet_id, sheet) + if not is_valid: + logger.info(f"Skipping syncing sheet {sheet}: {reason}") + yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) + yield as_airbyte_message(stream, AirbyteStreamStatus.INCOMPLETE) + continue + + column_index_to_name = sheet_to_column_index_to_name[sheet] + row_cursor = 2 # we start syncing past the header row + # For the loop, it is necessary that the initial row exists when we send a request to the API, + # if the last row of the interval goes outside the sheet - this is normal, we will return + # only the real data of the sheet and in the next iteration we will loop out. + while row_cursor <= sheet_row_counts[sheet]: + row_batch = SpreadsheetValues.parse_obj( + client.get_values( + sheet=sheet, + row_cursor=row_cursor, + spreadsheetId=spreadsheet_id, + majorDimension="ROWS", + ) + ) + + row_cursor += client.Backoff.row_batch_size + 1 + # there should always be one range since we requested only one + value_ranges = row_batch.valueRanges[0] + + if not value_ranges.values: + break + + row_values = value_ranges.values + if len(row_values) == 0: + break + + yield as_airbyte_message(stream, AirbyteStreamStatus.RUNNING) + for row in row_values: + if not Helpers.is_row_empty(row) and Helpers.row_contains_relevant_data(row, column_index_to_name.keys()): + yield AirbyteMessage(type=Type.RECORD, record=Helpers.row_data_to_record_message(sheet, row, column_index_to_name)) + + yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) + yield as_airbyte_message(stream, AirbyteStreamStatus.COMPLETE) + + def _checkpoint_state( + self, + stream_state: Mapping[str, Any], + state_manager, + stream_name: str, + stream_namespace: Optional[str], + ) -> AirbyteMessage: + state_manager.update_state_for_stream(stream_name, stream_namespace, stream_state) + return state_manager.create_state_message(stream_name, stream_namespace) + + def read( + self, + logger: logging.Logger, + config: json, + catalog: ConfiguredAirbyteCatalog, + state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, + ) -> Generator[AirbyteMessage, None, None]: + spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) + try: + yield from self._read(logger, config, catalog, state) + except errors.HttpError as e: + error_description = exception_description_by_status_code(e.status_code, spreadsheet_id) + + if e.status_code == status_codes.FORBIDDEN: + raise AirbyteTracedException( + message=f"Stopped syncing process. {error_description}", + internal_message=error_description, + failure_type=FailureType.config_error, + ) from e + if e.status_code == status_codes.TOO_MANY_REQUESTS: + raise AirbyteTracedException( + message=f"Stopped syncing process due to rate limits. {error_description}", + internal_message=error_description, + failure_type=FailureType.transient_error, + ) from e + else: + logger.info(f"{e.status_code}: {e.reason}. {error_description}") + raise AirbyteTracedException( + message=f"Stopped syncing process. {error_description}", + internal_message=error_description, + failure_type=FailureType.transient_error, + ) from e + finally: + logger.info(f"Finished syncing spreadsheet {spreadsheet_id}") + + @staticmethod + def get_credentials(config): + # backward compatible with old style config + if config.get("credentials_json"): + credentials = {"auth_type": "Service", "service_account_info": config.get("credentials_json")} + return credentials + + return config.get("credentials") diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py deleted file mode 100644 index 4500270c8e375..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_dymamic.py +++ /dev/null @@ -1,21 +0,0 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# - -from typing import Any, Mapping, Optional - -from airbyte_cdk.models import ConfiguredAirbyteCatalog -from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource -from airbyte_cdk.sources.source import TState - -""" -This file provides the necessary constructs to interpret a provided declarative YAML configuration file into -source connector. -WARNING: Do not modify this file. -""" - - -# Declarative Source -class SourceDynamicGoogleSheets(YamlDeclarativeSource): - def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): - super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) From 4d8772397c6edd62962bcd78fe2a1fe0a32cb529 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 19 Dec 2024 15:56:52 -0600 Subject: [PATCH 07/63] source-google-sheets: initial changes for integrations tests passing. --- .../integration/entrypoint_wrapper_helper.py | 28 ++++++ .../unit_tests/integration/request_builder.py | 3 +- .../integration/test_credentials.py | 2 + .../unit_tests/integration/test_source.py | 81 +++++++++++----- .../http/response/check_succeeded_range.json | 96 +++++++++++++++++++ 5 files changed, 187 insertions(+), 23 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py new file mode 100644 index 0000000000000..3aecfe78e33ff --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + +from airbyte_cdk.test.entrypoint_wrapper import read, EntrypointOutput, make_file, _run_command +import tempfile +from pathlib import Path +from typing import Any, Mapping + +from airbyte_cdk.sources import Source + + +def check( + source: Source, + config: Mapping[str, Any], + expecting_exception: bool = False, +) -> EntrypointOutput: + """ + config must be json serializable + :param expecting_exception: By default if there is an uncaught exception, the exception will be printed out. If this is expected, please + provide expecting_exception=True so that the test output logs are cleaner + """ + + with tempfile.TemporaryDirectory() as tmp_directory: + tmp_directory_path = Path(tmp_directory) + config_file = make_file(tmp_directory_path / "config.json", config) + + return _run_command( + source, ["check", "--config", config_file, "--debug"], expecting_exception + ) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py index af585b9e5fd44..77b4062d46c53 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py @@ -6,7 +6,8 @@ # todo: this should be picked from manifest in the future GOOGLE_SHEETS_BASE_URL = "https://sheets.googleapis.com/v4/spreadsheets" -OAUTH_AUTHORIZATION_ENDPOINT = "https://oauth2.googleapis.com" +# OAUTH_AUTHORIZATION_ENDPOINT = "https://oauth2.googleapis.com" +OAUTH_AUTHORIZATION_ENDPOINT = "https://www.googleapis.com/oauth2/v4" class RequestBuilder: @classmethod diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py index 4fdcd7fe0309d..57ff6377c7316 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py @@ -34,6 +34,8 @@ """ +AUTH_BODY = 'grant_type=refresh_token&client_id=43987534895734985.apps.googleusercontent.com&client_secret=2347586435987643598&refresh_token=1%2F%2F4398574389537495437983457985437' + service_account_info = { "type": "service_account", "project_id": "test-project-id", diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 6075f68535923..377d2911aeb8e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -3,24 +3,26 @@ import json from copy import deepcopy -from typing import Optional +from typing import Optional, Dict, Any from unittest import TestCase from unittest.mock import patch # patch("time.sleep") from unittest.mock import Mock import pytest -from airbyte_cdk.models import Status +from airbyte_cdk.models import Status, SyncMode, ConfiguredAirbyteCatalog, AirbyteMessage, Type, AirbyteConnectionStatus, AirbyteLogMessage, Level from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder -from airbyte_cdk.test.entrypoint_wrapper import read +from airbyte_cdk.test.entrypoint_wrapper import read, EntrypointOutput from airbyte_cdk.test.mock_http import HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template from airbyte_cdk.utils import AirbyteTracedException from source_google_sheets import SourceGoogleSheets -from .custom_http_mocker import CustomHttpMocker as HttpMocker +# from .custom_http_mocker import CustomHttpMocker as HttpMocker +from airbyte_cdk.test.mock_http import HttpMocker from .request_builder import AuthBuilder, RequestBuilder -from .test_credentials import oauth_credentials, service_account_credentials, service_account_info +from .test_credentials import oauth_credentials, service_account_credentials, service_account_info, AUTH_BODY +from .entrypoint_wrapper_helper import check _SPREADSHEET_ID = "a_spreadsheet_id" @@ -40,17 +42,34 @@ } +def _catalog(sync_mode: SyncMode) -> ConfiguredAirbyteCatalog: + return CatalogBuilder().with_stream(_STREAM_NAME, sync_mode).build() + +def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceGoogleSheets: + return SourceGoogleSheets(catalog=catalog, config=config, state=state) + +def _check(config: Dict[str, Any], expecting_exception: bool = False)-> EntrypointOutput: + sync_mode = SyncMode.full_refresh + catalog = _catalog(sync_mode) + source = _source(catalog=catalog, config=config, state={}) + return check(source, config, expecting_exception) + + class GoogleSheetSourceTest(TestCase): def setUp(self) -> None: self._config = deepcopy(_CONFIG) self._service_config = deepcopy(_SERVICE_CONFIG) - self._source = SourceGoogleSheets() + # self._source = SourceGoogleSheets() + + @staticmethod + def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: + return _check(config, expecting_exception=expecting_exception) @staticmethod def authorize(http_mocker: HttpMocker): # Authorization request with user credentials to "https://oauth2.googleapis.com" to obtain a token http_mocker.post( - AuthBuilder.get_token_endpoint().build(), + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), HttpResponse(json.dumps(find_template("auth_response", __file__)), 200) ) @@ -164,37 +183,54 @@ def get_stream_data(http_mocker: HttpMocker, range_data_response_file: str, rang def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_streams(http_mocker, "check_succeeded_meta") GoogleSheetSourceTest.get_schema(http_mocker, "check_succeeded_range") - connection_status = self._source.check(Mock(), self._config) - assert connection_status.status == Status.SUCCEEDED + + output = self._check(self._config, expecting_exception=False) + expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) + assert output.logs[-1] == expected_message def test_given_authentication_error_when_check_then_status_is_failed(self) -> None: del self._config["credentials"]["client_secret"] - connection_status = self._source.check(Mock(), self._config) - assert connection_status.status == Status.FAILED + output = self._check(self._config, expecting_exception=False) + msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'Service' was expected") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message + + @pytest.mark.skip("Need service credentials to test this behavior") def test_given_service_authentication_error_when_check_then_status_is_failed(self) -> None: + # todo, test this with service credentials wrong_service_account_info = deepcopy(service_account_info) del wrong_service_account_info["client_email"] - wrong_service_account_info_encoded = json.dumps(service_account_info).encode("utf-8") + wrong_service_account_info_encoded = json.dumps(service_account_info)#.encode("utf-8") wrong_service_account_credentials = { "auth_type": "Service", "service_account_info": wrong_service_account_info_encoded, } - connection_status = self._source.check(Mock(), wrong_service_account_credentials) - assert connection_status.status == Status.FAILED + wrong_config = { + "spreadsheet_id": _SPREADSHEET_ID, + "credentials": wrong_service_account_credentials + } + # connection_status = self._source.check(Mock(), wrong_service_account_credentials) + output = self._check(wrong_config, expecting_exception=True) + + msg = AirbyteConnectionStatus(status=Status.FAILED, message="") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message @HttpMocker() def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMocker) -> None: http_mocker.post( - AuthBuilder.get_token_endpoint().build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 200) - ) - with pytest.raises(AirbyteTracedException) as exc_info: - self._source.check(Mock(), self._config) - - assert str(exc_info.value) == ( - "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401) ) + # with pytest.raises(AirbyteTracedException) as exc_info: + # self._source.check(Mock(), self._config) + # todo: check error handlers for auth error + output = self._check(self._config, expecting_exception=True) + assert output + # assert str(exc_info.value) == ( + # "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." + # ) @HttpMocker() def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: @@ -487,3 +523,4 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: f"Unexpected return result: Sheet {_STREAM_NAME} was expected to contain data on exactly 1 sheet. " ) assert output.errors[0].trace.error.internal_message == expected_message + diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json index 425ef7fe8991e..72862cb3ad88f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json @@ -145,6 +145,102 @@ }, "data": [ { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "age" + }, + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], "rowMetadata": [ { "pixelSize": 21 From 5b61aed9f23379be9d93af8c3d24999d33fefa2f Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Sat, 21 Dec 2024 16:45:55 -0600 Subject: [PATCH 08/63] source-google-sheets: - all check operations (excelpt service auth flow) passing --- .../components/extractors.py | 8 +- .../source_google_sheets/manifest.yaml | 57 ++++- .../integration/entrypoint_wrapper_helper.py | 4 +- .../unit_tests/integration/test_source.py | 217 +++++++++++------- .../http/response/check_succeeded_range.json | 158 ++++++------- .../http/response/check_wrong_range.json | 194 +++++++++++++++- 6 files changed, 474 insertions(+), 164 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index d690f8375c7d5..9a7ca521fd419 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -44,13 +44,13 @@ def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self._values_to_match_key = parameters["values_to_match_key"] property_to_match_key = parameters["property_to_match_key"] - self._properties_to_match = FieldMatchingExtractor.extract_properties_to_match(parameters["properties_to_match"], property_to_match_key) + self._properties_to_match = FieldMatchingExtractor.extract_properties_to_match( + parameters["properties_to_match"], property_to_match_key + ) @staticmethod def extract_properties_to_match(properties_to_match, property_to_match_key): - indexed_properties = { - index: item_for_match[property_to_match_key] for index, item_for_match in enumerate(properties_to_match) - } + indexed_properties = {index: item_for_match[property_to_match_key] for index, item_for_match in enumerate(properties_to_match)} return indexed_properties @staticmethod diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index a48185c4235fc..a2cca76001979 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -98,6 +98,38 @@ dynamic_streams: $ref: "#/definitions/base_requester" description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: FAIL + predicate: >- + {{ 'sheets' in response and response["sheets"] | length != + 1 }} + http_codes: [] + # error lacks of information as error_message can't interpolate stream_slice["potato"] + error_message: >- + Unable to read the schema of sheet. Error: Unexpected return + result: Sheet was + expected to contain data on exactly 1 sheet. + # - type: DefaultErrorHandler + # response_filters: + - type: HttpResponseFilter + action: FAIL + predicate: >- + {{ response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list | length != + response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list | unique | list | length }} + error_message: >- + The following duplicate headers were found in the sheet. + Please fix them to continue: {% set values = + response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list %}{{ values | select("in", + values | reject("sameas", None) | reject("in", values | unique)) | + unique | list }} path: >- {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json components_mapping: @@ -161,6 +193,29 @@ definitions: path: >- {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=false&alt=json http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: FAIL + http_codes: + - 404 + error_message: >- + The spreadsheet link is not valid. Enter the URL of the + Google spreadsheet you want to sync. + # - type: DefaultErrorHandler + # response_filters: + - type: HttpResponseFilter + action: FAIL + http_codes: + - 403 + error_message: >- + The authenticated Google Sheets user does not have permissions to view the + spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access + to the Spreadsheet and reauthenticate. If the issue persists, contact support. + The caller does not have right permissions. record_selector: type: RecordSelector extractor: @@ -229,4 +284,4 @@ schemas: title: type: - string - - "null" \ No newline at end of file + - "null" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py index 3aecfe78e33ff..b9d93dee53e00 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py @@ -1,11 +1,11 @@ # Copyright (c) 2024 Airbyte, Inc., all rights reserved. -from airbyte_cdk.test.entrypoint_wrapper import read, EntrypointOutput, make_file, _run_command import tempfile from pathlib import Path -from typing import Any, Mapping +from typing import Any, Mapping from airbyte_cdk.sources import Source +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, _run_command, make_file, read def check( diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 377d2911aeb8e..497ebb9af2c20 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -3,26 +3,39 @@ import json from copy import deepcopy -from typing import Optional, Dict, Any +from typing import Any, Dict, Optional from unittest import TestCase from unittest.mock import patch # patch("time.sleep") -from unittest.mock import Mock +from unittest.mock import ANY, Mock import pytest -from airbyte_cdk.models import Status, SyncMode, ConfiguredAirbyteCatalog, AirbyteMessage, Type, AirbyteConnectionStatus, AirbyteLogMessage, Level +from airbyte_cdk.models import ( + AirbyteConnectionStatus, + AirbyteErrorTraceMessage, + AirbyteLogMessage, + AirbyteMessage, + AirbyteTraceMessage, + ConfiguredAirbyteCatalog, + FailureType, + Level, + Status, + SyncMode, + TraceType, + Type, +) from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder -from airbyte_cdk.test.entrypoint_wrapper import read, EntrypointOutput -from airbyte_cdk.test.mock_http import HttpResponse +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read + +# from .custom_http_mocker import CustomHttpMocker as HttpMocker +from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template from airbyte_cdk.utils import AirbyteTracedException from source_google_sheets import SourceGoogleSheets -# from .custom_http_mocker import CustomHttpMocker as HttpMocker -from airbyte_cdk.test.mock_http import HttpMocker -from .request_builder import AuthBuilder, RequestBuilder -from .test_credentials import oauth_credentials, service_account_credentials, service_account_info, AUTH_BODY from .entrypoint_wrapper_helper import check +from .request_builder import AuthBuilder, RequestBuilder +from .test_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info _SPREADSHEET_ID = "a_spreadsheet_id" @@ -74,7 +87,7 @@ def authorize(http_mocker: HttpMocker): ) @staticmethod - def get_streams(http_mocker: HttpMocker, streams_response_file: Optional[str]=None, meta_response_code: Optional[int]=200): + def get_spreadsheet_info_and_sheets(http_mocker: HttpMocker, streams_response_file: Optional[str]=None, meta_response_code: Optional[int]=200): """" Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order to obtain sheets (streams) from the spreed_sheet_id provided. @@ -102,7 +115,7 @@ def get_streams(http_mocker: HttpMocker, streams_response_file: Optional[str]=No ) @staticmethod - def get_schema(http_mocker: HttpMocker, headers_response_file: str, headers_response_code: int=200, stream_name: Optional[str]=_STREAM_NAME, data_initial_range_response_file: Optional[str]=None, data_initial_response_code: Optional[int]=200): + def get_sheet_first_row(http_mocker: HttpMocker, headers_response_file: str, headers_response_code: int=200, stream_name: Optional[str]=_STREAM_NAME, data_initial_range_response_file: Optional[str]=None, data_initial_response_code: Optional[int]=200): """" Mock request to 'https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=true&ranges=!1:1&alt=json' to obtain headers data (keys) used for stream schema from the spreadsheet + sheet provided. @@ -181,8 +194,8 @@ def get_stream_data(http_mocker: HttpMocker, range_data_response_file: str, rang @HttpMocker() def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "check_succeeded_meta") - GoogleSheetSourceTest.get_schema(http_mocker, "check_succeeded_range") + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_succeeded_range") output = self._check(self._config, expecting_exception=False) expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) @@ -223,61 +236,111 @@ def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMoc AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401) ) - # with pytest.raises(AirbyteTracedException) as exc_info: - # self._source.check(Mock(), self._config) - # todo: check error handlers for auth error output = self._check(self._config, expecting_exception=True) - assert output - # assert str(exc_info.value) == ( - # "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - # ) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="Something went wrong in the connector. See the logs for more details.", + internal_message='401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token', + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "invalid_link", 404) - - with pytest.raises(AirbyteTracedException) as exc_info: - self._source.check(Mock(), self._config) - assert str(exc_info.value) == ( - "Config error: The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync." + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", 404) + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync.", + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message def test_check_invalid_creds_json_file(self) -> None: - connection_status = self._source.check(Mock(), "") - assert "Please use valid credentials json file" in connection_status.message - assert connection_status.status == Status.FAILED + invalid_creds_json_file = {} + output = self._check(invalid_creds_json_file, expecting_exception=True) + msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'spreadsheet_id' is a required property") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message @HttpMocker() def test_check_access_expired(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "invalid_permissions", 403) - with pytest.raises(AirbyteTracedException) as exc_info: - self._source.check(Mock(), self._config) - assert str(exc_info.value) == ( - "Config error: " + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", 403) + error_message = ( + "The authenticated Google Sheets user does not have permissions to view the " + f"spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access" + " to the Spreadsheet and reauthenticate. If the issue persists, contact support. " + "The caller does not have right permissions." + ) + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.config_error, + stack_trace=ANY, + ), ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "check_succeeded_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "check_wrong_range", 200) - - connection_status = self._source.check(Mock(), self._config) - assert connection_status.status == Status.FAILED - assert connection_status.message == f'Unable to read the schema of sheet a_stream_name. Error: Unexpected return result: Sheet {_STREAM_NAME} was expected to contain data on exactly 1 sheet. ' + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_wrong_range", 200) + error_message = f'Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet.' + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "check_succeeded_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "check_duplicate_headers", 200) + # With headers, we refer to properties that will be used for schema + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) - connection_status = self._source.check(Mock(), self._config) - assert connection_status.status == Status.FAILED - assert connection_status.message == f"The following duplicate headers were found in the following sheets. Please fix them to continue: [sheet:{_STREAM_NAME}, headers:['header1']]" + error_message = f"The following duplicate headers were found in the sheet. Please fix them to continue: ['header1']" + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "only_headers_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "only_headers_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "only_headers_range", 200) discovered_catalog = self._source.discover(Mock(), self._config) assert len(discovered_catalog.streams) == 1 @@ -292,10 +355,10 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: _B_STREAM_NAME: {'email': {'type': 'string'}, 'name': {'type': 'string'}}, _C_STREAM_NAME: {'address': {'type': 'string'}} } - GoogleSheetSourceTest.get_streams(http_mocker, "multiple_streams_schemas_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) discovered_catalog = self._source.discover(Mock(), self._config) assert len(discovered_catalog.streams) == 3 @@ -304,8 +367,8 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "only_headers_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "names_conversion_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) self._config["names_conversion"] = True @@ -316,7 +379,7 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "internal_server_error", 500) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", 500) with pytest.raises(Exception) as exc_info, patch("time.sleep"), patch("backoff._sync._maybe_call", side_effect=lambda value: 3): self._source.discover(Mock(), self._config) @@ -340,7 +403,7 @@ def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocke @HttpMocker() def test_discover_404_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "invalid_link", 404) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", 404) with pytest.raises(AirbyteTracedException) as exc_info: @@ -353,7 +416,7 @@ def test_discover_404_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_403_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "invalid_permissions", 403) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", 403) with pytest.raises(AirbyteTracedException) as exc_info: @@ -368,22 +431,22 @@ def test_discover_403_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_given_grid_sheet_type_without_rows_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "no_rows_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "no_rows_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "no_rows_range", 200) discovered_catalog = self._source.discover(Mock(), self._config) assert len(discovered_catalog.streams) == 0 @HttpMocker() def test_given_not_grid_sheet_type_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "non_grid_sheet_meta", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) discovered_catalog = self._source.discover(Mock(), self._config) assert len(discovered_catalog.streams) == 0 @HttpMocker() def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta") - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range") + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range") GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -393,11 +456,11 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "multiple_streams_schemas_meta", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - GoogleSheetSourceTest.get_schema(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range_2") GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) @@ -435,8 +498,8 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker @HttpMocker() def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta_2", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range_2", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -453,8 +516,8 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt @HttpMocker() def test_read_429_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "rate_limit_error", 429) configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -469,8 +532,8 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_403_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", 403) configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -484,8 +547,8 @@ def test_read_403_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_500_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "internal_server_error", 500) configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -500,8 +563,8 @@ def test_read_500_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range_empty", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() @@ -513,8 +576,8 @@ def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_streams(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_schema(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json index 72862cb3ad88f..0d24407a38482 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_succeeded_range.json @@ -146,101 +146,101 @@ "data": [ { "rowData": [ - { - "values": [ - { - "userEnteredValue": { - "stringValue": "name" + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 }, - "effectiveValue": { - "stringValue": "name" + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 }, - "formattedValue": "name", - "effectiveFormat": { - "backgroundColor": { + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { "red": 1, "green": 1, "blue": 1 - }, - "padding": { - "top": 2, - "right": 3, - "bottom": 2, - "left": 3 - }, - "horizontalAlignment": "LEFT", - "verticalAlignment": "BOTTOM", - "wrapStrategy": "OVERFLOW_CELL", - "textFormat": { - "foregroundColor": {}, - "fontFamily": "Arial", - "fontSize": 10, - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "foregroundColorStyle": { - "rgbColor": {} - } - }, - "hyperlinkDisplayType": "PLAIN_TEXT", - "backgroundColorStyle": { - "rgbColor": { - "red": 1, - "green": 1, - "blue": 1 - } } } + } + }, + { + "userEnteredValue": { + "stringValue": "age" }, - { - "userEnteredValue": { - "stringValue": "age" + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 }, - "effectiveValue": { - "stringValue": "age" + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } }, - "formattedValue": "age", - "effectiveFormat": { - "backgroundColor": { + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { "red": 1, "green": 1, "blue": 1 - }, - "padding": { - "top": 2, - "right": 3, - "bottom": 2, - "left": 3 - }, - "horizontalAlignment": "LEFT", - "verticalAlignment": "BOTTOM", - "wrapStrategy": "OVERFLOW_CELL", - "textFormat": { - "foregroundColor": {}, - "fontFamily": "Arial", - "fontSize": 10, - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "foregroundColorStyle": { - "rgbColor": {} - } - }, - "hyperlinkDisplayType": "PLAIN_TEXT", - "backgroundColorStyle": { - "rgbColor": { - "red": 1, - "green": 1, - "blue": 1 - } } } } - ] - } - ], + } + ] + } + ], "rowMetadata": [ { "pixelSize": 21 diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_wrong_range.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_wrong_range.json index 770d4217b1579..56da0585eff14 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_wrong_range.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/check_wrong_range.json @@ -145,6 +145,102 @@ }, "data": [ { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "age" + }, + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], "rowMetadata": [ { "pixelSize": 21 @@ -161,7 +257,7 @@ { "properties": { "sheetId": 0, - "title": "a_stream_name", + "title": "b_stream_name", "index": 0, "sheetType": "GRID", "gridProperties": { @@ -171,6 +267,102 @@ }, "data": [ { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "age" + }, + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], "rowMetadata": [ { "pixelSize": 21 From e1f6a752c4699dde8fea0c7567c5aec9a46bbf9f Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 23 Dec 2024 11:46:16 -0600 Subject: [PATCH 09/63] source-google-sheets: all discovery operations passing --- .../components/__init__.py | 4 +- .../components/extractors.py | 71 ++++++- .../source_google_sheets/manifest.yaml | 199 +++++++++++------- .../source_google_sheets/source.py | 12 +- .../unit_tests/integration/test_source.py | 181 +++++++++++----- 5 files changed, 327 insertions(+), 140 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index 6414a8432bdbb..a085fce5b2d5c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,4 +1,4 @@ -from source_google_sheets.components.extractors import FieldMatchingExtractor +from source_google_sheets.components.extractors import FieldMatchingExtractor, DpathSchemaExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter -__all__ = ["FieldMatchingExtractor", "RangePartitionRouter"] +__all__ = ["FieldMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 9a7ca521fd419..1b0008e53c87d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -2,15 +2,19 @@ # Copyright (c) 2024 Airbyte, Inc., all rights reserved. # from dataclasses import dataclass -from typing import Any, Dict, Iterable, List, Mapping, MutableMapping +from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Union +import dpath import requests from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor +from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString +from airbyte_cdk.sources.types import Config +from source_google_sheets.utils import safe_name_conversion @dataclass class FieldMatchingExtractor(DpathExtractor): - """ " + """ Current DpathExtractor has problems for this type of data in response: [ { @@ -71,3 +75,66 @@ def extract_records(self, response: requests.Response) -> Iterable[MutableMappin unmatched_values_collection = raw_record[self._values_to_match_key] for unmatched_values in unmatched_values_collection: yield from FieldMatchingExtractor.match_properties_with_values(unmatched_values, self._properties_to_match) + + +class NamesConversionForRawSchema: + config: Config + + def _extract_data( + self, + body: Mapping[str, Any], + extraction_path: Optional[List[Union[InterpolatedString, str]]] = None, + default: Any = None, + ) -> Any: + """ + Extracts data from the body based on the provided extraction path. + """ + + if not extraction_path: + return body + + path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] + + return dpath.get(body, path, default=default) # type: ignore # extracted + + def _set_data( + self, value: Any, body: MutableMapping[str, Any], extraction_path: Optional[List[Union[InterpolatedString, str]]] = None + ) -> Any: + """ + Sets data in the body based on the provided extraction path. + """ + if not extraction_path: + body = value + + path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] + + dpath.set(body, path, value=value) + + def convert(self, schema_type_identifier, records: Iterable[MutableMapping[Any, Any]]): + schema_pointer = schema_type_identifier.get("schema_pointer") + key_pointer = schema_type_identifier["key_pointer"] + for record in records: + raw_schema_properties = self._extract_data(record, schema_pointer) + + for raw_schema_property in raw_schema_properties: + raw_schema_property_value = self._extract_data(raw_schema_property, key_pointer) + converted_value = self._convert_value(raw_schema_property_value) + self._set_data(converted_value, raw_schema_property, key_pointer) + yield record + + @staticmethod + def _convert_value(value: str): + return safe_name_conversion(value) + + +class DpathSchemaExtractor(DpathExtractor, NamesConversionForRawSchema): + def __post_init__(self, parameters: Mapping[str, Any]) -> None: + super().__post_init__(parameters) + self.names_conversion = self.config.get("names_conversion", False) + self.schema_type_identifier = parameters["schema_type_identifier"] + + def extract_records(self, response: requests.Response) -> Iterable[MutableMapping[Any, Any]]: + extracted_records = super().extract_records(response=response) + if self.names_conversion: + yield from self.convert(schema_type_identifier=self.schema_type_identifier, records=extracted_records) + yield from extracted_records diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index a2cca76001979..a3f70e4e8a53a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -53,6 +53,11 @@ dynamic_streams: type: NoPagination record_selector: extractor: + type: CustomRecordExtractor + class_name: source_google_sheets.components.DpathSchemaExtractor + parameters: + schema_type_identifier: + $ref: "#/definitions/schema_type_identifier" field_path: - sheets - "*" @@ -60,7 +65,6 @@ dynamic_streams: - "*" - rowData - "*" - type: DpathExtractor type: RecordSelector requester: $ref: "#/definitions/base_requester" @@ -69,69 +73,16 @@ dynamic_streams: http_method: GET path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' schema_type_identifier: - key_pointer: - - formattedValue - schema_pointer: - - values + $ref: "#/definitions/schema_type_identifier" + # key_pointer: + # - formattedValue + # schema_pointer: + # - values components_resolver: type: HttpComponentsResolver - description: We use spreadsheet information (sheets) to create streams. + description: We use first row of sheet to obtain data. retriever: - type: SimpleRetriever - paginator: - type: NoPagination - record_selector: - type: RecordSelector - extractor: - type: DpathExtractor - field_path: - - sheets - partition_router: - type: SubstreamPartitionRouter - parent_stream_configs: - - type: ParentStreamConfig - parent_key: title - partition_field: sheet_id - stream: - $ref: "#/definitions/streams/sheets" - requester: - $ref: "#/definitions/base_requester" - description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. - http_method: GET - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - response_filters: - - type: HttpResponseFilter - action: FAIL - predicate: >- - {{ 'sheets' in response and response["sheets"] | length != - 1 }} - http_codes: [] - # error lacks of information as error_message can't interpolate stream_slice["potato"] - error_message: >- - Unable to read the schema of sheet. Error: Unexpected return - result: Sheet was - expected to contain data on exactly 1 sheet. - # - type: DefaultErrorHandler - # response_filters: - - type: HttpResponseFilter - action: FAIL - predicate: >- - {{ response["sheets"][0]["data"][0]["rowData"][0]["values"] | - map(attribute="formattedValue") | list | length != - response["sheets"][0]["data"][0]["rowData"][0]["values"] | - map(attribute="formattedValue") | list | unique | list | length }} - error_message: >- - The following duplicate headers were found in the sheet. - Please fix them to continue: {% set values = - response["sheets"][0]["data"][0]["rowData"][0]["values"] | - map(attribute="formattedValue") | list %}{{ values | select("in", - values | reject("sameas", None) | reject("in", values | unique)) | - unique | list }} - path: >- - {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json + $ref: "#/definitions/retrievers/components_resolver_retriever" components_mapping: - field_path: - name @@ -183,9 +134,9 @@ dynamic_streams: definitions: streams: - sheets: + get_spreadsheet_info_and_sheets: type: DeclarativeStream - name: sheets + name: get_spreadsheet_info_and_sheets retriever: type: SimpleRetriever requester: @@ -198,24 +149,7 @@ definitions: error_handlers: - type: DefaultErrorHandler response_filters: - - type: HttpResponseFilter - action: FAIL - http_codes: - - 404 - error_message: >- - The spreadsheet link is not valid. Enter the URL of the - Google spreadsheet you want to sync. - # - type: DefaultErrorHandler - # response_filters: - - type: HttpResponseFilter - action: FAIL - http_codes: - - 403 - error_message: >- - The authenticated Google Sheets user does not have permissions to view the - spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access - to the Spreadsheet and reauthenticate. If the issue persists, contact support. - The caller does not have right permissions. + $ref: "#/definitions/response_filters/spreadsheet_info_stream_filters" record_selector: type: RecordSelector extractor: @@ -224,6 +158,9 @@ definitions: - sheets - "*" - properties + record_filter: + type: RecordFilter + condition: '{{ record["sheetType"] == "GRID" and record["gridProperties"]["rowCount"] > 0}}' schema_loader: type: InlineSchemaLoader schema: @@ -232,6 +169,106 @@ definitions: type: HttpRequester url_base: https://sheets.googleapis.com/v4/spreadsheets/ authenticator: "#/definitions/authenticator" + retrievers: + components_resolver_retriever: + type: SimpleRetriever + paginator: + type: NoPagination + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - sheets + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: title + partition_field: sheet_id + stream: + $ref: "#/definitions/streams/get_spreadsheet_info_and_sheets" + requester: + $ref: "#/definitions/base_requester" + description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + $ref: "#/definitions/response_filters/resolver_filters" + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json + + response_filters: + expected_one_sheet: + type: HttpResponseFilter + action: FAIL + predicate: >- + {{ 'sheets' in response and response["sheets"] | length != + 1 }} + http_codes: [] + # error lacks of information as error_message can't interpolate stream_slice["potato"] + error_message: >- + Unable to read the schema of sheet. Error: Unexpected return + result: Sheet was + expected to contain data on exactly 1 sheet. + ignore_duplicate_headers: + type: HttpResponseFilter + action: IGNORE + predicate: >- + {{ response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list | length != + response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list | unique | list | length }} + error_message: >- + The following duplicate headers were found in the sheet. + Please fix them to continue: {% set values = + response["sheets"][0]["data"][0]["rowData"][0]["values"] | + map(attribute="formattedValue") | list %}{{ values | select("in", + values | reject("sameas", None) | reject("in", values | unique)) | + unique | list }} + fail_duplicate_headers: + $ref: "#/definitions/response_filters/ignore_duplicate_headers" + action: FAIL + resolver_filters: + - $ref: "#/definitions/response_filters/expected_one_sheet" + - $ref: "#/definitions/response_filters/ignore_duplicate_headers" + check_operation_resolver_filters: + - $ref: "#/definitions/response_filters/expected_one_sheet" + - $ref: "#/definitions/response_filters/fail_duplicate_headers" + spreadsheet_info_stream_filters: + - type: HttpResponseFilter + action: FAIL + http_codes: + - 404 + error_message: >- + The spreadsheet link is not valid. Enter the URL of the + Google spreadsheet you want to sync. + - type: HttpResponseFilter + action: FAIL + http_codes: + - 403 + error_message: >- + The authenticated Google Sheets user does not have permissions to view the + spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access + to the Spreadsheet and reauthenticate. If the issue persists, contact support. + The caller does not have right permissions. + - type: HttpResponseFilter + action: RETRY + http_codes: + - 500 + error_message: >- + Could not discover the schema of your spreadsheet. There was an issue + with the Google Sheets API. This is usually a temporary issue from + Google's side. Please try again. If this issue persists, contact + support. Interval Server error. + schema_type_identifier: + key_pointer: + - formattedValue + schema_pointer: + - values bearer_authenticator: type: BearerAuthenticator api_token: "{{ config['credentials']['access_token'] }}" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index 18219ac7f9a08..d40678969a448 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -1,12 +1,13 @@ # # Copyright (c) 2024 Airbyte, Inc., all rights reserved. # - +import logging from typing import Any, Mapping, Optional from airbyte_cdk.models import ConfiguredAirbyteCatalog from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource from airbyte_cdk.sources.source import TState +from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus """ This file provides the necessary constructs to interpret a provided declarative YAML configuration file into @@ -19,3 +20,12 @@ class SourceGoogleSheets(YamlDeclarativeSource): def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) + + def check(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteConnectionStatus: + resolver_filters = self.resolved_manifest["dynamic_streams"][0]["components_resolver"]["retriever"]["requester"]["error_handler"][ + "error_handlers" + ][0]["response_filters"] + filters_for_check_operation = self.resolved_manifest["definitions"]["response_filters"]["check_operation_resolver_filters"] + resolver_filters.clear() + resolver_filters.extend(filters_for_check_operation) + return super().check(logger, config) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 497ebb9af2c20..eb6300a689d14 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -10,10 +10,12 @@ import pytest from airbyte_cdk.models import ( + AirbyteCatalog, AirbyteConnectionStatus, AirbyteErrorTraceMessage, AirbyteLogMessage, AirbyteMessage, + AirbyteStream, AirbyteTraceMessage, ConfiguredAirbyteCatalog, FailureType, @@ -25,9 +27,7 @@ ) from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder -from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read - -# from .custom_http_mocker import CustomHttpMocker as HttpMocker +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template from airbyte_cdk.utils import AirbyteTracedException @@ -67,17 +67,39 @@ def _check(config: Dict[str, Any], expecting_exception: bool = False)-> Entrypoi source = _source(catalog=catalog, config=config, state={}) return check(source, config, expecting_exception) +def _discover(config: Dict[str, Any], expecting_exception: bool = False)-> EntrypointOutput: + sync_mode = SyncMode.full_refresh + catalog = _catalog(sync_mode) + source = _source(catalog=catalog, config=config, state={}) + return discover(source, config, expecting_exception) + +def _read( + config: Dict[str, Any], + catalog: ConfiguredAirbyteCatalog, + state: Optional[Dict[str, Any]] = None, + expecting_exception: bool = False, +) -> EntrypointOutput: + + source = _source(catalog=catalog, config=config, state=state) + return read(source, config, catalog, state, expecting_exception) class GoogleSheetSourceTest(TestCase): def setUp(self) -> None: self._config = deepcopy(_CONFIG) self._service_config = deepcopy(_SERVICE_CONFIG) - # self._source = SourceGoogleSheets() @staticmethod def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: return _check(config, expecting_exception=expecting_exception) + @staticmethod + def _discover(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: + return _discover(config, expecting_exception=expecting_exception) + + @staticmethod + def _read(config: Dict[str, Any], catalog, expecting_exception: bool = False) -> EntrypointOutput: + return _read(config, SyncMode.full_refresh, expecting_exception=expecting_exception) + @staticmethod def authorize(http_mocker: HttpMocker): # Authorization request with user credentials to "https://oauth2.googleapis.com" to obtain a token @@ -342,108 +364,152 @@ def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_s GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "only_headers_range", 200) - discovered_catalog = self._source.discover(Mock(), self._config) - assert len(discovered_catalog.streams) == 1 - assert len(discovered_catalog.streams[0].json_schema["properties"]) == 2 + expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'header1': {'type': ['null', 'string']}, 'header2': {'type': ['null', 'string']}}, 'type': 'object'} + expected_catalog = AirbyteCatalog(streams=[AirbyteStream(name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False)]) + expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) + + output = self._discover(self._config, expecting_exception=False) + assert output.catalog == expected_message @HttpMocker() def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: - # When we move to manifest only is possible that DynamicSchemaLoader will identify fields like age as integers - # and addresses "oneOf": [{"type": ["null", "string"]}, {"type": ["null", "integer"]}] as it has mixed data expected_schemas_properties = { - _STREAM_NAME: {'age': {'type': 'string'}, 'name': {'type': 'string'}}, - _B_STREAM_NAME: {'email': {'type': 'string'}, 'name': {'type': 'string'}}, - _C_STREAM_NAME: {'address': {'type': 'string'}} + _STREAM_NAME: {'age': {'type': ['null', 'string']}, 'name': {'type': ['null', 'string']}}, + _B_STREAM_NAME: {'email': {'type': ['null', 'string']}, 'name': {'type': ['null', 'string']}}, + _C_STREAM_NAME: {'address': {'type': ['null', 'string']}} } GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) - discovered_catalog = self._source.discover(Mock(), self._config) - assert len(discovered_catalog.streams) == 3 - for current_stream in discovered_catalog.streams: - assert current_stream.json_schema["properties"] == expected_schemas_properties[current_stream.name] + expected_streams = [] + for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): + expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', + 'properties': expected_stream_properties, + 'type': 'object'} + expected_stream = AirbyteStream(name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + expected_streams.append(expected_stream) + expected_catalog = AirbyteCatalog(streams=expected_streams) + expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) + + output = self._discover(self._config, expecting_exception=False) + assert output.catalog == expected_message @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: + # will convert '1 тест' to '_1_test GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) + expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'_1_test': {'type': ['null', 'string']}, 'header_2': {'type': ['null', 'string']}}, 'type': 'object'} + expected_catalog = AirbyteCatalog(streams=[AirbyteStream(name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False)]) + expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) self._config["names_conversion"] = True - - discovered_catalog = self._source.discover(Mock(), self._config) - assert len(discovered_catalog.streams) == 1 - assert len(discovered_catalog.streams[0].json_schema["properties"]) == 2 - assert "_1_test" in discovered_catalog.streams[0].json_schema["properties"].keys() + output = self._discover(self._config, expecting_exception=False) + assert output + assert output.catalog == expected_message @HttpMocker() def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", 500) - with pytest.raises(Exception) as exc_info, patch("time.sleep"), patch("backoff._sync._maybe_call", side_effect=lambda value: 3): - self._source.discover(Mock(), self._config) - expected_message = ( - "Could not discover the schema of your spreadsheet. There was an issue with the Google Sheets API." - " This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support. Interval Server error." - ) - assert str(exc_info.value) == expected_message + with patch("time.sleep"): + output = self._discover(self._config, expecting_exception=True) + expected_message = ( + "Could not discover the schema of your spreadsheet. There was an issue with the Google Sheets API." + " This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support. Interval Server error." + ) + + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message='Something went wrong in the connector. See the logs for more details.', + internal_message=expected_message, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocker) -> None: http_mocker.post( - AuthBuilder.get_token_endpoint().build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 200) + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401) ) - with pytest.raises(Exception) as exc_info: - self._source.discover(Mock(), self._config) - expected_message = 'Access to the spreadsheet expired or was revoked. Re-authenticate to restore access.' - assert str(exc_info.value) == expected_message + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="Something went wrong in the connector. See the logs for more details.", + internal_message='401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token', + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + output = self._discover(self._config, expecting_exception=True) + assert output.errors[-1] == expected_message @HttpMocker() def test_discover_404_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", 404) - - with pytest.raises(AirbyteTracedException) as exc_info: - - self._source.discover(Mock(), self._config) - expected_message = ( - f"The requested Google Sheets spreadsheet with id {_SPREADSHEET_ID} does not exist." - " Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support. Requested entity was not found.." + output = self._discover(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync.", + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), ) - assert str(exc_info.value) == expected_message + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_discover_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", 403) - - with pytest.raises(AirbyteTracedException) as exc_info: - - self._source.discover(Mock(), self._config) - expected_message = ( + output = self._discover(self._config, expecting_exception=True) + error_message = ( "The authenticated Google Sheets user does not have permissions to view the " f"spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access" " to the Spreadsheet and reauthenticate. If the issue persists, contact support. " "The caller does not have right permissions." ) - assert str(exc_info.value) == expected_message + + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.config_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message @HttpMocker() def test_given_grid_sheet_type_without_rows_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "no_rows_range", 200) - - discovered_catalog = self._source.discover(Mock(), self._config) - assert len(discovered_catalog.streams) == 0 + output = self._discover(self._config, expecting_exception=False) + assert len(output.catalog.catalog.streams) == 0 @HttpMocker() def test_given_not_grid_sheet_type_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) - discovered_catalog = self._source.discover(Mock(), self._config) - assert len(discovered_catalog.streams) == 0 + output = self._discover(self._config, expecting_exception=False) + assert len(output.catalog.catalog.streams) == 0 @HttpMocker() + @pytest.mark.skip("Pending to review") def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range") @@ -455,6 +521,7 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: assert len(output.records) == 2 @HttpMocker() + @pytest.mark.skip("Pending to review") def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) @@ -497,6 +564,7 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker assert output.trace_messages[output_id + 6].trace.stream_status.status == expected_status @HttpMocker() + @pytest.mark.skip("Pending to review") def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) @@ -515,6 +583,7 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt @HttpMocker() + @pytest.mark.skip("Pending to review") def test_read_429_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) @@ -531,6 +600,7 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.message == expected_message @HttpMocker() + @pytest.mark.skip("Pending to review") def test_read_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) @@ -546,6 +616,7 @@ def test_read_403_error(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.message == expected_message @HttpMocker() + @pytest.mark.skip("Pending to review") def test_read_500_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) @@ -562,6 +633,7 @@ def test_read_500_error(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.message == expected_message @HttpMocker() + @pytest.mark.skip("Pending to review") def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) @@ -575,6 +647,7 @@ def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() + @pytest.mark.skip("Pending to review") def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) From 30b66731eff88773e44f71af4f69e6e866968dea Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 23 Dec 2024 20:03:19 -0600 Subject: [PATCH 10/63] source-google-sheets: all original read integration tests passing --- .../source_google_sheets/manifest.yaml | 91 ++++++++----- .../unit_tests/integration/test_source.py | 124 +++++++++++------- .../http/response/names_conversion_range.json | 2 +- 3 files changed, 138 insertions(+), 79 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index a3f70e4e8a53a..03bc5e651d8c1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -45,6 +45,12 @@ dynamic_streams: name: "" http_method: GET path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json' + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + $ref: "#/definitions/response_filters/stream_data_filters" schema_loader: type: DynamicSchemaLoader retriever: @@ -74,10 +80,6 @@ dynamic_streams: path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' schema_type_identifier: $ref: "#/definitions/schema_type_identifier" - # key_pointer: - # - formattedValue - # schema_pointer: - # - values components_resolver: type: HttpComponentsResolver description: We use first row of sheet to obtain data. @@ -129,7 +131,7 @@ dynamic_streams: - $parameters - batch_size type: ComponentMappingDefinition - value: "{{config['batch_size']}}" + value: "{{config.get('batch_size', 200)}}" description: batch size count for dynamic stream partition router (slicer). definitions: @@ -192,14 +194,14 @@ definitions: $ref: "#/definitions/base_requester" description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. http_method: GET + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json error_handler: type: CompositeErrorHandler error_handlers: - type: DefaultErrorHandler response_filters: $ref: "#/definitions/response_filters/resolver_filters" - path: >- - {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json response_filters: expected_one_sheet: @@ -232,6 +234,49 @@ definitions: fail_duplicate_headers: $ref: "#/definitions/response_filters/ignore_duplicate_headers" action: FAIL + not_found: + type: HttpResponseFilter + action: FAIL + http_codes: + - 404 + error_message: >- + The spreadsheet link is not valid. Enter the URL of the + Google spreadsheet you want to sync. + forbidden: + type: HttpResponseFilter + action: FAIL + http_codes: + - 403 + error_message: >- + The authenticated Google Sheets user does not have permissions to view the + spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access + to the Spreadsheet and reauthenticate. If the issue persists, contact support. + The caller does not have right permissions. + base_server_error: + type: HttpResponseFilter + action: RETRY + http_codes: + - 500 + server_error_spreadsheet_info: + $ref: "#/definitions/response_filters/base_server_error" + error_message: >- + Could not discover the schema of your spreadsheet. There was an issue + with the Google Sheets API. This is usually a temporary issue from + Google's side. Please try again. If this issue persists, contact + support. Interval Server error. + server_error_stream_data: + $ref: "#/definitions/response_filters/base_server_error" + error_message: >- + There was an issue with the Google Sheets API. This is usually a temporary + issue from Google's side. Please try again. If this issue persists, contact support + rate_limit: + type: HttpResponseFilter + action: RETRY + http_codes: + - 429 + error_message: >- + Stopped syncing process due to rate limits. Rate limit has been + reached. Please try later or request a higher quota for your account. resolver_filters: - $ref: "#/definitions/response_filters/expected_one_sheet" - $ref: "#/definitions/response_filters/ignore_duplicate_headers" @@ -239,31 +284,13 @@ definitions: - $ref: "#/definitions/response_filters/expected_one_sheet" - $ref: "#/definitions/response_filters/fail_duplicate_headers" spreadsheet_info_stream_filters: - - type: HttpResponseFilter - action: FAIL - http_codes: - - 404 - error_message: >- - The spreadsheet link is not valid. Enter the URL of the - Google spreadsheet you want to sync. - - type: HttpResponseFilter - action: FAIL - http_codes: - - 403 - error_message: >- - The authenticated Google Sheets user does not have permissions to view the - spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access - to the Spreadsheet and reauthenticate. If the issue persists, contact support. - The caller does not have right permissions. - - type: HttpResponseFilter - action: RETRY - http_codes: - - 500 - error_message: >- - Could not discover the schema of your spreadsheet. There was an issue - with the Google Sheets API. This is usually a temporary issue from - Google's side. Please try again. If this issue persists, contact - support. Interval Server error. + - $ref: "#/definitions/response_filters/not_found" + - $ref: "#/definitions/response_filters/forbidden" + - $ref: "#/definitions/response_filters/server_error_spreadsheet_info" + stream_data_filters: + - $ref: "#/definitions/response_filters/server_error_stream_data" + - $ref: "#/definitions/response_filters/forbidden" + - $ref: "#/definitions/response_filters/rate_limit" schema_type_identifier: key_pointer: - formattedValue diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index eb6300a689d14..fd2295f15c480 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -5,8 +5,7 @@ from copy import deepcopy from typing import Any, Dict, Optional from unittest import TestCase -from unittest.mock import patch # patch("time.sleep") -from unittest.mock import ANY, Mock +from unittest.mock import ANY, patch import pytest from airbyte_cdk.models import ( @@ -16,11 +15,13 @@ AirbyteLogMessage, AirbyteMessage, AirbyteStream, + AirbyteStreamStatusTraceMessage, AirbyteTraceMessage, ConfiguredAirbyteCatalog, FailureType, Level, Status, + StreamDescriptor, SyncMode, TraceType, Type, @@ -30,7 +31,6 @@ from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from airbyte_cdk.utils import AirbyteTracedException from source_google_sheets import SourceGoogleSheets from .entrypoint_wrapper_helper import check @@ -45,13 +45,14 @@ _CONFIG = { - "spreadsheet_id": _SPREADSHEET_ID, - "credentials": oauth_credentials + "spreadsheet_id": _SPREADSHEET_ID, + "credentials": oauth_credentials, + "batch_size": 200 } _SERVICE_CONFIG = { - "spreadsheet_id": _SPREADSHEET_ID, - "credentials": service_account_credentials + "spreadsheet_id": _SPREADSHEET_ID, + "credentials": service_account_credentials } @@ -80,7 +81,7 @@ def _read( expecting_exception: bool = False, ) -> EntrypointOutput: - source = _source(catalog=catalog, config=config, state=state) + source = _source(catalog=catalog, config=config, state={}) return read(source, config, catalog, state, expecting_exception) class GoogleSheetSourceTest(TestCase): @@ -97,8 +98,8 @@ def _discover(config: Dict[str, Any], expecting_exception: bool = True) -> Entry return _discover(config, expecting_exception=expecting_exception) @staticmethod - def _read(config: Dict[str, Any], catalog, expecting_exception: bool = False) -> EntrypointOutput: - return _read(config, SyncMode.full_refresh, expecting_exception=expecting_exception) + def _read(config: Dict[str, Any], catalog: ConfiguredAirbyteCatalog, expecting_exception: bool = False) -> EntrypointOutput: + return _read(config, catalog, expecting_exception=expecting_exception) @staticmethod def authorize(http_mocker: HttpMocker): @@ -509,7 +510,6 @@ def test_given_not_grid_sheet_type_when_discover_then_ignore_stream(self, http_m assert len(output.catalog.catalog.streams) == 0 @HttpMocker() - @pytest.mark.skip("Pending to review") def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range") @@ -517,11 +517,23 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + assert len(output.records) == 2 + + @HttpMocker() + @pytest.mark.skip("Pending to do") + def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range") + GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") + + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"_1_test": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + + self._config["names_conversion"] = True + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 2 @HttpMocker() - @pytest.mark.skip("Pending to review") def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) @@ -548,23 +560,36 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker ) .build()) - output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 9 assert output.state_messages[0].state.stream.stream_descriptor.name == _STREAM_NAME assert output.state_messages[1].state.stream.stream_descriptor.name == _B_STREAM_NAME assert output.state_messages[2].state.stream.stream_descriptor.name == _C_STREAM_NAME - airbyte_stream_statuses = [AirbyteStreamStatus.COMPLETE, AirbyteStreamStatus.RUNNING, AirbyteStreamStatus.STARTED] - for output_id in range(3): - assert output.state_messages[output_id].state.stream.stream_state == AirbyteStateBlob(__ab_no_cursor_state_message=True) - expected_status = airbyte_stream_statuses.pop() - assert output.trace_messages[output_id].trace.stream_status.status == expected_status - assert output.trace_messages[output_id + 3].trace.stream_status.status == expected_status - assert output.trace_messages[output_id + 6].trace.stream_status.status == expected_status + expected_messages = [] + for current_stream in [_STREAM_NAME, _B_STREAM_NAME, _C_STREAM_NAME]: + for current_status in [AirbyteStreamStatus.COMPLETE, AirbyteStreamStatus.RUNNING, AirbyteStreamStatus.STARTED]: + stream_descriptor = StreamDescriptor( + name=current_stream, + namespace=None + ) + stream_status = AirbyteStreamStatusTraceMessage( + status= current_status, + stream_descriptor=stream_descriptor + ) + airbyte_trace_message = AirbyteTraceMessage( + type=TraceType.STREAM_STATUS, + emitted_at=ANY, + stream_status= stream_status + ) + airbyte_message = AirbyteMessage(type=Type.TRACE, trace=airbyte_trace_message) + expected_messages.append(airbyte_message) + assert len(output.trace_messages) == len(expected_messages) + for message in expected_messages: + assert message in output.trace_messages @HttpMocker() - @pytest.mark.skip("Pending to review") def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) @@ -572,7 +597,7 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 5 assert output.state_messages[0].state.stream.stream_state == AirbyteStateBlob(__ab_no_cursor_state_message=True) assert output.state_messages[0].state.stream.stream_descriptor.name == _STREAM_NAME @@ -583,7 +608,6 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt @HttpMocker() - @pytest.mark.skip("Pending to review") def test_read_429_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) @@ -591,72 +615,80 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - with patch("time.sleep"), patch("backoff._sync._maybe_call", side_effect=lambda value: 1): - output = read(self._source, self._config, configured_catalog) + with patch("time.sleep"): + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - "Stopped syncing process due to rate limits. Rate limit has been reached. Please try later or request a higher quota for your account." + "Exception while syncing stream a_stream_name: Stopped syncing process due to rate limits. Rate limit has been reached. Please try later or request a higher quota for your account." ) - assert output.errors[0].trace.error.message == expected_message + assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() - @pytest.mark.skip("Pending to review") def test_read_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", 403) - configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - output = read(self._source, self._config, configured_catalog) + # output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - f"Stopped syncing process. The authenticated Google Sheets user does not have permissions to view the spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support" + f"The authenticated Google Sheets user does not have permissions to view the spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support. The caller does not have right permissions." ) assert output.errors[0].trace.error.message == expected_message @HttpMocker() - @pytest.mark.skip("Pending to review") def test_read_500_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "internal_server_error", 500) - configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - with patch("time.sleep"), patch("backoff._sync._maybe_call", side_effect=lambda value: 1): - output = read(self._source, self._config, configured_catalog) + with patch("time.sleep"): + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - "Stopped syncing process. There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support" + "Exception while syncing stream a_stream_name: There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support" ) - assert output.errors[0].trace.error.message == expected_message + assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() - @pytest.mark.skip("Pending to review") def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - f"Unexpected return result: Sheet {_STREAM_NAME} was expected to contain data on exactly 1 sheet. " + f"Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet." ) - assert output.errors[0].trace.error.internal_message == expected_message + assert output.errors[0].trace.error.message == expected_message @HttpMocker() - @pytest.mark.skip("Pending to review") def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - output = read(self._source, self._config, configured_catalog) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - f"Unexpected return result: Sheet {_STREAM_NAME} was expected to contain data on exactly 1 sheet. " + f"Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet." ) - assert output.errors[0].trace.error.internal_message == expected_message + assert output.errors[0].trace.error.message == expected_message + + @pytest.mark.skip("Pending to do") + def test_name_conversion_for_schema_match(self): + pass + + @pytest.mark.skip("Pending to do") + def test_for_columns_empty_does_right_match(self): + pass + @pytest.mark.skip("Pending to do") + def test_for_increase_batch_size_when_rate_limit(self): + pass diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/names_conversion_range.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/names_conversion_range.json index 3fd4fad8d83b5..bbbf0898ffd38 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/names_conversion_range.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/names_conversion_range.json @@ -139,7 +139,7 @@ "index": 0, "sheetType": "GRID", "gridProperties": { - "rowCount": 1, + "rowCount": 3, "columnCount": 2 } }, From 510e07431870ddb20e29f95eb52e4242409c4e94 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 24 Dec 2024 12:54:54 -0600 Subject: [PATCH 11/63] source-google-sheets: test for read with conversion ready and also changes to discard empty cells in first row --- .../components/__init__.py | 4 +- .../components/extractors.py | 162 +++++++++++------- .../source_google_sheets/manifest.yaml | 7 +- .../unit_tests/integration/test_source.py | 61 ++++++- 4 files changed, 157 insertions(+), 77 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index a085fce5b2d5c..9e0ca0009ff99 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,4 +1,4 @@ -from source_google_sheets.components.extractors import FieldMatchingExtractor, DpathSchemaExtractor +from source_google_sheets.components.extractors import DpathSchemaMatchingExtractor, DpathSchemaExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter -__all__ = ["FieldMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor"] +__all__ = ["DpathSchemaMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 1b0008e53c87d..eb1b3c66b57f8 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -9,11 +9,92 @@ from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString from airbyte_cdk.sources.types import Config -from source_google_sheets.utils import safe_name_conversion +from source_google_sheets.utils import name_conversion, safe_name_conversion + + +class RawSchemaParser: + config: Config + + def _extract_data( + self, + body: Mapping[str, Any], + extraction_path: Optional[List[Union[InterpolatedString, str]]] = None, + default: Any = None, + ) -> Any: + """ + Extracts data from the body based on the provided extraction path. + """ + + if not extraction_path: + return body + + path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] + + return dpath.get(body, path, default=default) # type: ignore # extracted + + def _set_data( + self, value: Any, body: MutableMapping[str, Any], extraction_path: Optional[List[Union[InterpolatedString, str]]] = None + ) -> Any: + """ + Sets data in the body based on the provided extraction path. + """ + if not extraction_path: + body = value + + path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] + + dpath.set(body, path, value=value) + + def parse_raw_schema_values( + self, + raw_schema_data: MutableMapping[Any, Any], + schema_pointer: List[Union[InterpolatedString, str]], + key_pointer: List[Union[InterpolatedString, str]], + names_conversion: bool, + ): + """ + Parses sheet headers from the provided row. This method assumes that data is contiguous + i.e: every cell contains a value and the first cell which does not contain a value denotes the end + of the headers. + """ + raw_schema_properties = self._extract_data(raw_schema_data, schema_pointer) + duplicate_fields = set() + parsed_schema_values = [] + seen_values = set() + for property_index, raw_schema_property in enumerate(raw_schema_properties): + raw_schema_property_value = self._extract_data(raw_schema_property, key_pointer) + if not raw_schema_property_value: + break + if names_conversion: + raw_schema_property_value = safe_name_conversion(raw_schema_property_value) + + if raw_schema_property_value in seen_values: + duplicate_fields.add(raw_schema_property_value) + seen_values.add(raw_schema_property_value) + parsed_schema_values.append((property_index, raw_schema_property_value, raw_schema_property)) + + if duplicate_fields: + parsed_schema_values = [ + parsed_schema_value for parsed_schema_value in parsed_schema_values if parsed_schema_values[1] not in duplicate_fields + ] + + return parsed_schema_values + + def parse(self, schema_type_identifier, records: Iterable[MutableMapping[Any, Any]]): + names_conversion = self.config.get("names_conversion", False) + schema_pointer = schema_type_identifier.get("schema_pointer") + key_pointer = schema_type_identifier["key_pointer"] + + for raw_schema_data in records: + for _, parsed_value, raw_schema_property in self.parse_raw_schema_values( + raw_schema_data, schema_pointer, key_pointer, names_conversion + ): + self._set_data(parsed_value, raw_schema_property, key_pointer) + yield raw_schema_data @dataclass -class FieldMatchingExtractor(DpathExtractor): +class DpathSchemaMatchingExtractor(DpathExtractor, RawSchemaParser): """ Current DpathExtractor has problems for this type of data in response: [ @@ -47,14 +128,20 @@ class FieldMatchingExtractor(DpathExtractor): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self._values_to_match_key = parameters["values_to_match_key"] - property_to_match_key = parameters["property_to_match_key"] - self._properties_to_match = FieldMatchingExtractor.extract_properties_to_match( - parameters["properties_to_match"], property_to_match_key + schema_type_identifier = parameters["schema_type_identifier"] + names_conversion = self.config.get("names_conversion", False) + self._indexed_properties_to_match = self.extract_properties_to_match( + parameters["properties_to_match"], schema_type_identifier, names_conversion=names_conversion ) - @staticmethod - def extract_properties_to_match(properties_to_match, property_to_match_key): - indexed_properties = {index: item_for_match[property_to_match_key] for index, item_for_match in enumerate(properties_to_match)} + def extract_properties_to_match(self, properties_to_match, schema_type_identifier, names_conversion): + schema_pointer = schema_type_identifier.get("schema_pointer") + key_pointer = schema_type_identifier["key_pointer"] + indexed_properties = {} + for property_index, property_parsed_value, _ in self.parse_raw_schema_values( + properties_to_match, schema_pointer, key_pointer, names_conversion + ): + indexed_properties[property_index] = property_parsed_value return indexed_properties @staticmethod @@ -74,67 +161,14 @@ def extract_records(self, response: requests.Response) -> Iterable[MutableMappin for raw_record in raw_records_extracted: unmatched_values_collection = raw_record[self._values_to_match_key] for unmatched_values in unmatched_values_collection: - yield from FieldMatchingExtractor.match_properties_with_values(unmatched_values, self._properties_to_match) - - -class NamesConversionForRawSchema: - config: Config - - def _extract_data( - self, - body: Mapping[str, Any], - extraction_path: Optional[List[Union[InterpolatedString, str]]] = None, - default: Any = None, - ) -> Any: - """ - Extracts data from the body based on the provided extraction path. - """ - - if not extraction_path: - return body - - path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] - - return dpath.get(body, path, default=default) # type: ignore # extracted - - def _set_data( - self, value: Any, body: MutableMapping[str, Any], extraction_path: Optional[List[Union[InterpolatedString, str]]] = None - ) -> Any: - """ - Sets data in the body based on the provided extraction path. - """ - if not extraction_path: - body = value - - path = [node.eval(self.config) if not isinstance(node, str) else node for node in extraction_path] - - dpath.set(body, path, value=value) - - def convert(self, schema_type_identifier, records: Iterable[MutableMapping[Any, Any]]): - schema_pointer = schema_type_identifier.get("schema_pointer") - key_pointer = schema_type_identifier["key_pointer"] - for record in records: - raw_schema_properties = self._extract_data(record, schema_pointer) - - for raw_schema_property in raw_schema_properties: - raw_schema_property_value = self._extract_data(raw_schema_property, key_pointer) - converted_value = self._convert_value(raw_schema_property_value) - self._set_data(converted_value, raw_schema_property, key_pointer) - yield record - - @staticmethod - def _convert_value(value: str): - return safe_name_conversion(value) + yield from DpathSchemaMatchingExtractor.match_properties_with_values(unmatched_values, self._indexed_properties_to_match) -class DpathSchemaExtractor(DpathExtractor, NamesConversionForRawSchema): +class DpathSchemaExtractor(DpathExtractor, RawSchemaParser): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) - self.names_conversion = self.config.get("names_conversion", False) self.schema_type_identifier = parameters["schema_type_identifier"] def extract_records(self, response: requests.Response) -> Iterable[MutableMapping[Any, Any]]: extracted_records = super().extract_records(response=response) - if self.names_conversion: - yield from self.convert(schema_type_identifier=self.schema_type_identifier, records=extracted_records) - yield from extracted_records + yield from self.parse(schema_type_identifier=self.schema_type_identifier, records=extracted_records) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 03bc5e651d8c1..eb5891b3fcd35 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -26,13 +26,14 @@ dynamic_streams: record_selector: extractor: type: CustomRecordExtractor - class_name: source_google_sheets.components.FieldMatchingExtractor + class_name: source_google_sheets.components.DpathSchemaMatchingExtractor description: Extract record list of values (rows) and matches such values to correct schema property to generate individual records. field_path: - valueRanges - "*" $parameters: - property_to_match_key: "formattedValue" + schema_type_identifier: + $ref: "#/definitions/schema_type_identifier" values_to_match_key: "values" properties_to_match: "" type: RecordSelector @@ -115,7 +116,7 @@ dynamic_streams: - $parameters - properties_to_match type: ComponentMappingDefinition - value: "{{components_values['data'][0]['rowData'][0]['values']}}" + value: "{{components_values['data'][0]['rowData'][0]}}" description: indexed_schema to match with row values. - field_path: - retriever diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index fd2295f15c480..bf50236d5bec5 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -14,6 +14,7 @@ AirbyteErrorTraceMessage, AirbyteLogMessage, AirbyteMessage, + AirbyteRecordMessage, AirbyteStream, AirbyteStreamStatusTraceMessage, AirbyteTraceMessage, @@ -399,7 +400,7 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: - # will convert '1 тест' to '_1_test + # will convert '1 тест' to '_1_test and 'header2' to 'header_2' GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'_1_test': {'type': ['null', 'string']}, 'header_2': {'type': ['null', 'string']}}, 'type': 'object'} @@ -408,7 +409,6 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: self._config["names_conversion"] = True output = self._discover(self._config, expecting_exception=False) - assert output assert output.catalog == expected_message @HttpMocker() @@ -514,24 +514,65 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range") GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") - - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + first_property = "header_1" + second_property = "header_2" + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {first_property: { "type": ["null", "string"] }, second_property: { "type": ["null", "string"] }}})).build() output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + expected_records = [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_11', second_property: 'value_12'} + ) + ), + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_21', second_property: 'value_22'} + ) + ) + ] assert len(output.records) == 2 + assert output.records == expected_records @HttpMocker() - @pytest.mark.skip("Pending to do") def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: + # will convert '1 тест' to '_1_test and 'header2' to 'header_2' GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range") GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"_1_test": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + first_expected_converted_property = "_1_test" + second_expected_converted_property = "header_2" + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {first_expected_converted_property: { "type": ["null", "string"] }, second_expected_converted_property: { "type": ["null", "string"] }}})).build() self._config["names_conversion"] = True output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + expected_records = [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_expected_converted_property: 'value_11', second_expected_converted_property: 'value_12'} + ) + ), + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_expected_converted_property: 'value_21', second_expected_converted_property: 'value_22'} + ) + ) + ] assert len(output.records) == 2 + assert output.records == expected_records @HttpMocker() def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: @@ -682,11 +723,15 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.message == expected_message @pytest.mark.skip("Pending to do") - def test_name_conversion_for_schema_match(self): + def test_for_empty_columns_does_right_discovery(self): + # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. + # 2.- Empty cell in header will mark the end of the header row. pass @pytest.mark.skip("Pending to do") - def test_for_columns_empty_does_right_match(self): + def test_for_empty_columns_does_right_match(self): + # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. + # 2.- Empty cell in header will mark the end of the header row. pass @pytest.mark.skip("Pending to do") From 76def284c51b26fbc99c833f55290c9f5f5f4a4b Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 24 Dec 2024 13:15:22 -0600 Subject: [PATCH 12/63] source-google-sheets: add support for empty cells --- .../components/extractors.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index eb1b3c66b57f8..e9b7baf8a30ce 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -156,12 +156,31 @@ def match_properties_with_values(unmatched_values: List[str], ordered_properties data[ordered_properties[relevant_index]] = unmatch_value yield data + @staticmethod + def is_row_empty(cell_values: List[str]) -> bool: + for cell in cell_values: + if cell.strip() != "": + return False + return True + + @staticmethod + def row_contains_relevant_data(cell_values: List[str], relevant_indices: Iterable[int]) -> bool: + for idx in relevant_indices: + if len(cell_values) > idx and cell_values[idx].strip() != "": + return True + return False + def extract_records(self, response: requests.Response) -> Iterable[MutableMapping[Any, Any]]: raw_records_extracted = super().extract_records(response=response) for raw_record in raw_records_extracted: unmatched_values_collection = raw_record[self._values_to_match_key] for unmatched_values in unmatched_values_collection: - yield from DpathSchemaMatchingExtractor.match_properties_with_values(unmatched_values, self._indexed_properties_to_match) + if not DpathSchemaMatchingExtractor.is_row_empty( + unmatched_values + ) and DpathSchemaMatchingExtractor.row_contains_relevant_data(unmatched_values, self._indexed_properties_to_match.keys()): + yield from DpathSchemaMatchingExtractor.match_properties_with_values( + unmatched_values, self._indexed_properties_to_match + ) class DpathSchemaExtractor(DpathExtractor, RawSchemaParser): From f9f658b5a398e54fa8c8f300444767874043b30b Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 24 Dec 2024 17:03:22 -0600 Subject: [PATCH 13/63] source-google-sheets: add tests for empty columns --- .../components/extractors.py | 4 +- .../unit_tests/integration/test_source.py | 83 +++- ...with_empty_column_get_sheet_first_row.json | 397 ++++++++++++++++++ ...ty_column_spreadsheet_info_and_sheets.json | 149 +++++++ ...with_empty_column_get_sheet_first_row.json | 397 ++++++++++++++++++ ...ith_empty_column_get_spreadsheet_info.json | 149 +++++++ ...ead_with_empty_column_get_stream_data.json | 13 + 7 files changed, 1188 insertions(+), 4 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_spreadsheet_info_and_sheets.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_spreadsheet_info.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_stream_data.json diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index e9b7baf8a30ce..e3298f246169f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -84,12 +84,14 @@ def parse(self, schema_type_identifier, records: Iterable[MutableMapping[Any, An names_conversion = self.config.get("names_conversion", False) schema_pointer = schema_type_identifier.get("schema_pointer") key_pointer = schema_type_identifier["key_pointer"] - + parsed_properties = [] for raw_schema_data in records: for _, parsed_value, raw_schema_property in self.parse_raw_schema_values( raw_schema_data, schema_pointer, key_pointer, names_conversion ): self._set_data(parsed_value, raw_schema_property, key_pointer) + parsed_properties.append(raw_schema_property) + self._set_data(parsed_properties, raw_schema_data, schema_pointer) yield raw_schema_data diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index bf50236d5bec5..54470624979c6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -56,6 +56,9 @@ "credentials": service_account_credentials } +GET_SHEETS_FIRST_ROW = "get_sheet_first_row" +GET_SPREADSHEET_INFO = "get_spreadsheet_info" +GET_STREAM_DATA = "get_stream_data" def _catalog(sync_mode: SyncMode) -> ConfiguredAirbyteCatalog: return CatalogBuilder().with_stream(_STREAM_NAME, sync_mode).build() @@ -385,6 +388,32 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + expected_streams = [] + for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): + expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', + 'properties': expected_stream_properties, + 'type': 'object'} + expected_stream = AirbyteStream(name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + expected_streams.append(expected_stream) + expected_catalog = AirbyteCatalog(streams=expected_streams) + expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) + + output = self._discover(self._config, expecting_exception=False) + assert output.catalog == expected_message + + @HttpMocker() + def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMocker) -> None: + """ + The response from headers (first row) has columns "name | age | | address | address2" so everything after empty cell will be + discarded, in this case address and address2 shouldn't be part of the schema. + """ + expected_schemas_properties = { + _STREAM_NAME: {'name': {'type': ['null', 'string']}, 'age': {'type': ['null', 'string']}}, + } + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) + + expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', @@ -540,6 +569,43 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: assert len(output.records) == 2 assert output.records == expected_records + @HttpMocker() + def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocker) -> None: + """ + The response from headers (first row) has columns "header_1 | header_2 | | address | address2" so everything after empty cell will be + discarded, in this case address and address2 shouldn't be part of the schema in records. + """ + test_file_base_name = "read_with_empty_column" + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + first_property = "header_1" + second_property = "header_2" + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( + {"properties": {first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}}})).build() + + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + expected_records = [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_11', second_property: 'value_12'} + ) + ), + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_21', second_property: 'value_22'} + ) + ) + ] + assert len(output.records) == 2 + assert output.records == expected_records + @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' @@ -647,7 +713,6 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt assert output.trace_messages[1].trace.stream_status.status == AirbyteStreamStatus.RUNNING assert output.trace_messages[2].trace.stream_status.status == AirbyteStreamStatus.COMPLETE - @HttpMocker() def test_read_429_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) @@ -723,13 +788,25 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.message == expected_message @pytest.mark.skip("Pending to do") - def test_for_empty_columns_does_right_discovery(self): + def test_for_duplicated_headers_right_discovery(self): + # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. + # 2.- Empty cell in header will mark the end of the header row. + pass + + @pytest.mark.skip("Pending to do") + def test_for_duplicated_headers_right_read(self): + # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. + # 2.- Empty cell in header will mark the end of the header row. + pass + + @pytest.mark.skip("Pending to do") + def test_for_empty_rows_does_right_read(self): # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. # 2.- Empty cell in header will mark the end of the header row. pass @pytest.mark.skip("Pending to do") - def test_for_empty_columns_does_right_match(self): + def test_complex_test_with_empty_rows_and_columns_duplicated_headers_after_how_many_requests_ends(self): # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. # 2.- Empty cell in header will mark the end of the header row. pass diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_get_sheet_first_row.json new file mode 100644 index 0000000000000..e016c8454cf80 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_get_sheet_first_row.json @@ -0,0 +1,397 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 4, + "columnCount": 5 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "age" + }, + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address" + }, + "effectiveValue": { + "stringValue": "address" + }, + "formattedValue": "address", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address2" + }, + "effectiveValue": { + "stringValue": "address2" + }, + "formattedValue": "address2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_spreadsheet_info_and_sheets.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_spreadsheet_info_and_sheets.json new file mode 100644 index 0000000000000..f6ebb9263e87b --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_with_empty_column_spreadsheet_info_and_sheets.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 4, + "columnCount": 5 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_sheet_first_row.json new file mode 100644 index 0000000000000..553d8679f5919 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_sheet_first_row.json @@ -0,0 +1,397 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "header_1" + }, + "effectiveValue": { + "stringValue": "header_1" + }, + "formattedValue": "header_1", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "header_2" + }, + "effectiveValue": { + "stringValue": "header_2" + }, + "formattedValue": "header_2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address" + }, + "effectiveValue": { + "stringValue": "address" + }, + "formattedValue": "address", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address2" + }, + "effectiveValue": { + "stringValue": "address2" + }, + "formattedValue": "address2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_spreadsheet_info.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_spreadsheet_info.json new file mode 100644 index 0000000000000..6a3b42579f386 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_spreadsheet_info.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_stream_data.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_stream_data.json new file mode 100644 index 0000000000000..fcd7a312fc233 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_with_empty_column_get_stream_data.json @@ -0,0 +1,13 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "valueRanges": [ + { + "range": "a_stream_name!A2:E3", + "majorDimension": "ROWS", + "values": [ + ["value_11", "value_12", "", "main", "main st"], + ["value_21", "value_22", "", "washington 3", "colonial"] + ] + } + ] +} From 4b6636be4ff78268371986135d9bbd53600f6d2b Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 31 Dec 2024 14:06:21 -0600 Subject: [PATCH 14/63] source-google-sheets: complete all read protocol tests --- .../components/extractors.py | 2 +- .../source_google_sheets/manifest.yaml | 33 +- .../unit_tests/integration/test_source.py | 188 ++++++-- ...uplicated_headers_get_sheet_first_row.json | 406 ++++++++++++++++++ ...plicated_headers_get_spreadsheet_info.json | 149 +++++++ .../read_by_batches_get_sheet_first_row.json | 313 ++++++++++++++ .../read_by_batches_get_spreadsheet_info.json | 149 +++++++ ...y_batches_get_stream_data_fifth_batch.json | 17 + ...y_batches_get_stream_data_first_batch.json | 30 ++ ..._batches_get_stream_data_fourth_batch.json | 22 + ..._batches_get_stream_data_second_batch.json | 22 + ...y_batches_get_stream_data_third_batch.json | 30 ++ ...uplicated_headers_get_sheet_first_row.json | 406 ++++++++++++++++++ ...plicated_headers_get_spreadsheet_info.json | 149 +++++++ ...ad_duplicated_headers_get_stream_data.json | 13 + .../read_empty_rows_get_sheet_first_row.json | 313 ++++++++++++++ .../read_empty_rows_get_spreadsheet_info.json | 149 +++++++ .../read_empty_rows_get_stream_data.json | 41 ++ 18 files changed, 2397 insertions(+), 35 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_spreadsheet_info.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fifth_batch.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_first_batch.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fourth_batch.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_second_batch.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_third_batch.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_spreadsheet_info.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_stream_data.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_sheet_first_row.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_spreadsheet_info.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_stream_data.json diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index e3298f246169f..f281dec79f293 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -75,7 +75,7 @@ def parse_raw_schema_values( if duplicate_fields: parsed_schema_values = [ - parsed_schema_value for parsed_schema_value in parsed_schema_values if parsed_schema_values[1] not in duplicate_fields + parsed_schema_value for parsed_schema_value in parsed_schema_values if parsed_schema_value[1] not in duplicate_fields ] return parsed_schema_values diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index eb5891b3fcd35..dd773bcb609dc 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -226,15 +226,36 @@ definitions: response["sheets"][0]["data"][0]["rowData"][0]["values"] | map(attribute="formattedValue") | list | unique | list | length }} error_message: >- - The following duplicate headers were found in the sheet. - Please fix them to continue: {% set values = - response["sheets"][0]["data"][0]["rowData"][0]["values"] | - map(attribute="formattedValue") | list %}{{ values | select("in", - values | reject("sameas", None) | reject("in", values | unique)) | - unique | list }} + {%- set headers_found = response["sheets"][0]["data"][0]["rowData"][0]["values"] | map(attribute="formattedValue") | list -%} + {%- set headers_count = {} -%} + {%- set duplicate_fields = [] -%} + {%- for headerFound in headers_found -%} + {%- if headerFound is not none -%} + {%- set headers_count = headers_count.update({headerFound: headers_count.get(headerFound, 0) + 1}) or headers_count -%} + {%- if headers_count.get(headerFound) > 1 and headerFound not in duplicate_fields -%} + {%- set duplicate_fields = duplicate_fields.append(headerFound) -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + Duplicate headers found in sheet. + Ignoring them: {{ duplicate_fields }} fail_duplicate_headers: $ref: "#/definitions/response_filters/ignore_duplicate_headers" action: FAIL + error_message: >- + {%- set headers_found = response["sheets"][0]["data"][0]["rowData"][0]["values"] | map(attribute="formattedValue") | list -%} + {%- set headers_count = {} -%} + {%- set duplicate_fields = [] -%} + {%- for headerFound in headers_found -%} + {%- if headerFound is not none -%} + {%- set headers_count = headers_count.update({headerFound: headers_count.get(headerFound, 0) + 1}) or headers_count -%} + {%- if headers_count.get(headerFound) > 1 and headerFound not in duplicate_fields -%} + {%- set duplicate_fields = duplicate_fields.append(headerFound) -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + The following duplicate headers were found in the sheet. + Please fix them to continue: {{ duplicate_fields }} not_found: type: HttpResponseFilter action: FAIL diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 54470624979c6..eadf0c4e200f1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -3,7 +3,7 @@ import json from copy import deepcopy -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Tuple from unittest import TestCase from unittest.mock import ANY, patch @@ -56,8 +56,8 @@ "credentials": service_account_credentials } -GET_SHEETS_FIRST_ROW = "get_sheet_first_row" GET_SPREADSHEET_INFO = "get_spreadsheet_info" +GET_SHEETS_FIRST_ROW = "get_sheet_first_row" GET_STREAM_DATA = "get_stream_data" def _catalog(sync_mode: SyncMode) -> ConfiguredAirbyteCatalog: @@ -191,7 +191,7 @@ def get_sheet_first_row(http_mocker: HttpMocker, headers_response_file: str, hea ) @staticmethod - def get_stream_data(http_mocker: HttpMocker, range_data_response_file: str, range_response_code: int=200, stream_name:Optional[str]=_STREAM_NAME): + def get_stream_data(http_mocker: HttpMocker, data_response_file: str, response_code: int=200, stream_name:Optional[str]=_STREAM_NAME, request_range: Tuple=(2,202) ): """" Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' to obtain value ranges (data) for stream from the spreadsheet + sheet provided. @@ -213,10 +213,12 @@ def get_stream_data(http_mocker: HttpMocker, range_data_response_file: str, rang ] } """ - batch_request_ranges = f"{stream_name}!2:202" + start_range = str(request_range[0]) + end_range = str(request_range[1]) + batch_request_ranges = f"{stream_name}!{start_range}:{end_range}" http_mocker.get( RequestBuilder.get_account_endpoint().with_spreadsheet_id(_SPREADSHEET_ID).with_ranges(batch_request_ranges).with_major_dimension("ROWS").with_alt("json").build(), - HttpResponse(json.dumps(find_template(range_data_response_file, __file__)), range_response_code) + HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code) ) @HttpMocker() @@ -427,6 +429,33 @@ def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMoc output = self._discover(self._config, expecting_exception=False) assert output.catalog == expected_message + @HttpMocker() + def test_discover_with_duplicated_return_expected_schema(self, http_mocker: HttpMocker): + """ + The response from headers (first row) has columns "header_1 | header_2 | header_2 | address | address2" so header_2 will + be ignored from schema. + """ + expected_schema_properties = {'header_1': {'type': ['null', 'string']}, 'address': {'type': ['null', 'string']}, 'address2': {'type': ['null', 'string']} + } + test_file_base_name = "discover_duplicated_headers" + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + + expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', + 'properties': expected_schema_properties, + 'type': 'object'} + expected_stream = AirbyteStream(name=_STREAM_NAME, json_schema=expected_schema, + supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + + expected_catalog = AirbyteCatalog(streams=[expected_stream]) + expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) + expected_log_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet. Ignoring them: ['header_2']")) + + output = self._discover(self._config, expecting_exception=False) + + assert output.catalog == expected_message + assert output.logs[-1] == expected_log_message + @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' @@ -606,6 +635,132 @@ def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocke assert len(output.records) == 2 assert output.records == expected_records + @HttpMocker() + def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker: HttpMocker): + """" + header_2 will be ignored from records as column is duplicated. + + header_1 header_2 header_2 address address2 + value_11 value_12 value_13 main main st + value_21 value_22 value_23 washington 3 colonial + + It will correctly match row values and field/column names in read records. + """ + test_file_base_name = "read_duplicated_headers" + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + first_property = "header_1" + second_property = "address" + third_property = "address2" + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( + {"properties": {first_property: {"type": ["null", "string"]}, + second_property: {"type": ["null", "string"]}, + third_property: {"type": ["null", "string"]}, + }}) + + ).build() + + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + expected_records = [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_11', second_property: 'main', third_property: 'main st'} + ) + ), + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={first_property: 'value_21', second_property: 'washington 3', third_property: 'colonial'} + ) + ) + ] + assert len(output.records) == 2 + assert output.records == expected_records + + @HttpMocker() + def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): + """" + There are a few empty rows in the response that we shuld ignore + + e.g. + id name normalized_name + 7 Children children + 12 Mechanical Santa mechanical santa + 13 Tattoo Man tattoo man + 16 DOCTOR ZITSOFSKY doctor zitsofsky + + + 20 Students students + + There are two empty rows between id 16 and 20 that we will not be present in read records + """ + test_file_base_name = "read_empty_rows" + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + expected_properties = ["id", "name", "normalized_name"] + catalog_properties = {} + for property in expected_properties: + catalog_properties[property] = {"type": ["null", "string"]} + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( + {"properties": catalog_properties}) + + ).build() + + records_in_response = find_template(f"{test_file_base_name}_{GET_STREAM_DATA}", __file__) + empty_row_count = 0 + expected_rows_found = 23 + expected_empty_rows = 7 + expected_records = [] + + for row in records_in_response["valueRanges"][0]["values"]: + if row: + expected_records += [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={expected_property:row_value for expected_property,row_value in zip(expected_properties, row)} + ) + ) + ] + else: + empty_row_count += 1 + assert empty_row_count == expected_empty_rows + assert len(expected_records) == expected_rows_found + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + assert len(output.records) == expected_rows_found + assert output.records == expected_records + + @HttpMocker() + def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMocker): + test_file_base_name = "read_by_batches" + batch_size = 10 + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + start_range = 2 + for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): + end_range = start_range + batch_size + request_range = (start_range, end_range) + GoogleSheetSourceTest.get_stream_data(http_mocker, data_response_file=f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", request_range=request_range) + start_range += batch_size + 1 + catalog_properties = {} + for expected_property in ["id", "name", "normalized_name"]: + catalog_properties[expected_property] = {"type": ["null", "string"]} + configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( + {"properties": catalog_properties}) + ).build() + self._config["batch_size"] = batch_size + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + assert len(output.records) > 0 + @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' @@ -787,29 +942,6 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: ) assert output.errors[0].trace.error.message == expected_message - @pytest.mark.skip("Pending to do") - def test_for_duplicated_headers_right_discovery(self): - # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. - # 2.- Empty cell in header will mark the end of the header row. - pass - - @pytest.mark.skip("Pending to do") - def test_for_duplicated_headers_right_read(self): - # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. - # 2.- Empty cell in header will mark the end of the header row. - pass - - @pytest.mark.skip("Pending to do") - def test_for_empty_rows_does_right_read(self): - # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. - # 2.- Empty cell in header will mark the end of the header row. - pass - - @pytest.mark.skip("Pending to do") - def test_complex_test_with_empty_rows_and_columns_duplicated_headers_after_how_many_requests_ends(self): - # 1.- Empty and duplicated headers won't make it to the schema, either the indexed or json schema. - # 2.- Empty cell in header will mark the end of the header row. - pass @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_sheet_first_row.json new file mode 100644 index 0000000000000..06bb1b3324e12 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_sheet_first_row.json @@ -0,0 +1,406 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "header_1" + }, + "effectiveValue": { + "stringValue": "header_1" + }, + "formattedValue": "header_1", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "header_2" + }, + "effectiveValue": { + "stringValue": "header_2" + }, + "formattedValue": "header_2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "header_2" + }, + "effectiveValue": { + "stringValue": "header_2" + }, + "formattedValue": "header_2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address" + }, + "effectiveValue": { + "stringValue": "address" + }, + "formattedValue": "address", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address2" + }, + "effectiveValue": { + "stringValue": "address2" + }, + "formattedValue": "address2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_spreadsheet_info.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_spreadsheet_info.json new file mode 100644 index 0000000000000..6a3b42579f386 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/discover_duplicated_headers_get_spreadsheet_info.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row.json new file mode 100644 index 0000000000000..1a4cf1d047f74 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row.json @@ -0,0 +1,313 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "properties": { + "title": "a_spreadsheet_id_4", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 51, + "columnCount": 4 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "id" + }, + "effectiveValue": { + "stringValue": "id" + }, + "formattedValue": "id", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "normalized_name" + }, + "effectiveValue": { + "stringValue": "normalized_name" + }, + "formattedValue": "normalized_name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 113 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info.json new file mode 100644 index 0000000000000..1e4c8ba0e6604 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "properties": { + "title": "a_spreadsheet_id_4", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 51, + "columnCount": 4 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fifth_batch.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fifth_batch.json new file mode 100644 index 0000000000000..5e57c68c566a3 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fifth_batch.json @@ -0,0 +1,17 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "valueRanges": [ + { + "range": "a_stream_name!A46:D51", + "majorDimension": "ROWS", + "values": [ + ["45", "Simpson Neighborhood", "simpson neighborhood"], + ["46", "Master Bedroom", "master bedroom"], + ["47", "LIVING ROOM", "living room"], + ["48", "Springfield Town Hall", "springfield town hall"], + ["49", "CITY COUNCIL CHAMBERS", "city council chambers"], + ["50", "Park", "park"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_first_batch.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_first_batch.json new file mode 100644 index 0000000000000..f348a6fd3ff89 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_first_batch.json @@ -0,0 +1,30 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "valueRanges": [ + { + "range": "a_stream_name!A2:D12", + "majorDimension": "ROWS", + "values": [ + ["1", "Street", "street"], + ["2", "Car", "car"], + ["3", "Springfield Elementary School", "springfield elementary school"], + ["4", "Auditorium", "auditorium"], + ["5", "Simpson Home", "simpson home"], + ["6", "KITCHEN", "kitchen"], + ["7", "SHOPPING MALL PARKING LOT", "shopping mall parking lot"], + ["8", "Springfield Mall", "springfield mall"], + [ + "9", + "The Happy Sailor Tattoo Parlor", + "the happy sailor tattoo parlor" + ], + [ + "10", + "Springfield Nuclear Power Plant", + "springfield nuclear power plant" + ], + ["11", "PLANT", "plant"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fourth_batch.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fourth_batch.json new file mode 100644 index 0000000000000..a2ebb994bd8be --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_fourth_batch.json @@ -0,0 +1,22 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "valueRanges": [ + { + "range": "a_stream_name!A35:D45", + "majorDimension": "ROWS", + "values": [ + ["34", "SCHOOL BUILDING", "school building"], + ["35", "Simpson Back Porch", "simpson back porch"], + ["36", "Bus", "bus"], + ["37", "Road", "road"], + ["38", "Conference Room", "conference room"], + ["39", "COFFEE ROOM", "coffee room"], + ["40", "Bar", "bar"], + ["41", "Berger's Burgers", "berger burgers"], + ["42", "REFRIGERATOR", "refrigerator"], + ["43", "Bart's Bedroom", "bart bedroom"], + ["44", "Simpson Backyard", "simpson backyard"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_second_batch.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_second_batch.json new file mode 100644 index 0000000000000..ec6faa96359a9 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_second_batch.json @@ -0,0 +1,22 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "valueRanges": [ + { + "range": "a_stream_name!A13:D23", + "majorDimension": "ROWS", + "values": [ + ["12", "DERMATOLOGY CLINIC", "dermatology clinic"], + ["13", "Laboratory", "laboratory"], + ["14", "Circus of Values", "circus of values"], + ["15", "Moe's Tavern", "moe tavern"], + ["16", "Santa School", "santa school"], + ["17", "Santa's Workshop", "santa workshop"], + ["18", "WORKSHOP", "workshop"], + ["19", "PERSONNEL OFFICE", "personnel office"], + ["20", "Springfield Downs Dog Track", "springfield downs dog track"], + ["21", "SPRINGFIELD DOWNS", "springfield downs"], + ["22", "PADDOCK", "paddock"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_third_batch.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_third_batch.json new file mode 100644 index 0000000000000..893cd92081992 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_stream_data_third_batch.json @@ -0,0 +1,30 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "valueRanges": [ + { + "range": "a_stream_name!A24:D34", + "majorDimension": "ROWS", + "values": [ + ["23", "SPRINGFIELD DOWN", "springfield down"], + [ + "24", + "SPRINGFIELD DOWNS PARKING LOT", + "springfield downs parking lot" + ], + ["25", "Simpson Living Room", "simpson living room"], + [ + "26", + "Springfield Elementary School Playground", + "springfield elementary school playground" + ], + ["27", "CLASSROOM", "classroom"], + ["28", "Skinner's Office", "skinner office"], + ["29", "Homer's Car", "homer car"], + ["30", "NEW SCHOOL", "new school"], + ["31", "Opera House", "opera house"], + ["32", "OLD SCHOOL", "old school"], + ["33", "NEW CLASSROOM", "new classroom"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_sheet_first_row.json new file mode 100644 index 0000000000000..06bb1b3324e12 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_sheet_first_row.json @@ -0,0 +1,406 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "header_1" + }, + "effectiveValue": { + "stringValue": "header_1" + }, + "formattedValue": "header_1", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "header_2" + }, + "effectiveValue": { + "stringValue": "header_2" + }, + "formattedValue": "header_2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "header_2" + }, + "effectiveValue": { + "stringValue": "header_2" + }, + "formattedValue": "header_2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address" + }, + "effectiveValue": { + "stringValue": "address" + }, + "formattedValue": "address", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "address2" + }, + "effectiveValue": { + "stringValue": "address2" + }, + "formattedValue": "address2", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_spreadsheet_info.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_spreadsheet_info.json new file mode 100644 index 0000000000000..6a3b42579f386 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_spreadsheet_info.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "properties": { + "title": "a_spreadsheet_id_2", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 3, + "columnCount": 5 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_stream_data.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_stream_data.json new file mode 100644 index 0000000000000..b505035c8263d --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_duplicated_headers_get_stream_data.json @@ -0,0 +1,13 @@ +{ + "spreadsheetId": "1Swhi9KP2bWqllwnVQCCE5WhQjCVd-GjBD46Qc2ZcWQQ", + "valueRanges": [ + { + "range": "a_stream_name!A2:E3", + "majorDimension": "ROWS", + "values": [ + ["value_11", "value_12", "value_13", "main", "main st"], + ["value_21", "value_22", "value_23", "washington 3", "colonial"] + ] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_sheet_first_row.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_sheet_first_row.json new file mode 100644 index 0000000000000..7ad8a1370ca40 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_sheet_first_row.json @@ -0,0 +1,313 @@ +{ + "spreadsheetId": "1snees8bdeblGLiv5439GRx4uTEac0spYw_BXvJEHfI0", + "properties": { + "title": "a_spreadsheet_id_3", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 34, + "columnCount": 4 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "id" + }, + "effectiveValue": { + "stringValue": "id" + }, + "formattedValue": "id", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "normalized_name" + }, + "effectiveValue": { + "stringValue": "normalized_name" + }, + "formattedValue": "normalized_name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 113 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1snees8bdeblGLiv5439GRx4uTEac0spYw_BXvJEHfI0/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_spreadsheet_info.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_spreadsheet_info.json new file mode 100644 index 0000000000000..30503df155c46 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_spreadsheet_info.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1snees8bdeblGLiv5439GRx4uTEac0spYw_BXvJEHfI0", + "properties": { + "title": "a_spreadsheet_id_3", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "a_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 34, + "columnCount": 4 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1snees8bdeblGLiv5439GRx4uTEac0spYw_BXvJEHfI0/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_stream_data.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_stream_data.json new file mode 100644 index 0000000000000..4d5834a442f04 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_empty_rows_get_stream_data.json @@ -0,0 +1,41 @@ +{ + "spreadsheetId": "1snees8bdeblGLiv5439GRx4uTEac0spYw_BXvJEHfI0", + "valueRanges": [ + { + "range": "a_stream_name!A2:D34", + "majorDimension": "ROWS", + "values": [ + ["7", "Children", "children"], + ["12", "Mechanical Santa", "mechanical santa"], + ["13", "Tattoo Man", "tattoo man"], + ["16", "DOCTOR ZITSOFSKY", "doctor zitsofsky"], + [], + [], + ["20", "Students", "students"], + ["24", "Little Boy", "little boy"], + ["26", "Lewis Clark", "lewis clark"], + ["27", "Little Girl", "little girl"], + ["29", "Bubbles", "bubbles"], + ["30", "Moldy", "moldy"], + [], + [], + [], + ["34", "Ticket Seller", "ticket seller"], + ["35", "Elf #1", "elf 1"], + ["36", "Elves", "elves"], + ["37", "Dog's Owner", "dogs owner"], + ["39", "Kids", "kids"], + ["41", "Conductor", "conductor"], + ["42", "Secretary", "secretary"], + ["46", "Sydney", "sydney"], + [], + ["47", "Cecile Shapiro", "cecile shapiro"], + ["48", "Ian", "ian"], + ["49", "Calvin", "calvin"], + [], + ["50", "Martin Prince, Sr.", "martin prince sr"], + ["51", "Richard", "richard"] + ] + } + ] +} From 6c53e9e856a212b5fda0f0158cb0f0ed1b7b8586 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 1 Jan 2025 15:55:34 -0600 Subject: [PATCH 15/63] source-google-sheets: reduce unnecesary response filters --- .../source_google_sheets/manifest.yaml | 64 ++++++++------- .../source_google_sheets/source.py | 19 +++-- .../unit_tests/integration/test_source.py | 79 +++++++++---------- 3 files changed, 78 insertions(+), 84 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index dd773bcb609dc..3013b6e0e434c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -45,13 +45,14 @@ dynamic_streams: sheet_id: "" name: "" http_method: GET - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json' + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json error_handler: type: CompositeErrorHandler error_handlers: - type: DefaultErrorHandler response_filters: - $ref: "#/definitions/response_filters/stream_data_filters" + $ref: "#/definitions/response_filters/response_error_filters" schema_loader: type: DynamicSchemaLoader retriever: @@ -78,7 +79,14 @@ dynamic_streams: $parameters: sheet_id: "" http_method: GET - path: '{% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json' + path: >- + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + $ref: "#/definitions/response_filters/single_sheet_response_error_filters" schema_type_identifier: $ref: "#/definitions/schema_type_identifier" components_resolver: @@ -152,7 +160,7 @@ definitions: error_handlers: - type: DefaultErrorHandler response_filters: - $ref: "#/definitions/response_filters/spreadsheet_info_stream_filters" + $ref: "#/definitions/response_filters/response_error_filters" record_selector: type: RecordSelector extractor: @@ -202,7 +210,7 @@ definitions: error_handlers: - type: DefaultErrorHandler response_filters: - $ref: "#/definitions/response_filters/resolver_filters" + $ref: "#/definitions/response_filters/single_sheet_response_error_filters" response_filters: expected_one_sheet: @@ -256,14 +264,16 @@ definitions: {%- endfor -%} The following duplicate headers were found in the sheet. Please fix them to continue: {{ duplicate_fields }} - not_found: + server_error: type: HttpResponseFilter - action: FAIL + action: RETRY http_codes: - - 404 + - 500 error_message: >- - The spreadsheet link is not valid. Enter the URL of the - Google spreadsheet you want to sync. + There was an issue + with the Google Sheets API. This is usually a temporary issue from + Google's side. Please try again. If this issue persists, contact + support forbidden: type: HttpResponseFilter action: FAIL @@ -274,44 +284,32 @@ definitions: spreadsheet with id {{config["spreadsheet_id"]}}. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support. The caller does not have right permissions. - base_server_error: + not_found: type: HttpResponseFilter - action: RETRY + action: FAIL http_codes: - - 500 - server_error_spreadsheet_info: - $ref: "#/definitions/response_filters/base_server_error" - error_message: >- - Could not discover the schema of your spreadsheet. There was an issue - with the Google Sheets API. This is usually a temporary issue from - Google's side. Please try again. If this issue persists, contact - support. Interval Server error. - server_error_stream_data: - $ref: "#/definitions/response_filters/base_server_error" + - 404 error_message: >- - There was an issue with the Google Sheets API. This is usually a temporary - issue from Google's side. Please try again. If this issue persists, contact support + The requested Google Sheets spreadsheet with id {{config["spreadsheet_id"]}} does not exist. + Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support rate_limit: type: HttpResponseFilter action: RETRY http_codes: - 429 error_message: >- - Stopped syncing process due to rate limits. Rate limit has been + Rate limit has been reached. Please try later or request a higher quota for your account. - resolver_filters: + single_sheet_response_error_filters: - $ref: "#/definitions/response_filters/expected_one_sheet" - $ref: "#/definitions/response_filters/ignore_duplicate_headers" - check_operation_resolver_filters: + check_operation_single_sheet_response_error_filters: - $ref: "#/definitions/response_filters/expected_one_sheet" - $ref: "#/definitions/response_filters/fail_duplicate_headers" - spreadsheet_info_stream_filters: - - $ref: "#/definitions/response_filters/not_found" - - $ref: "#/definitions/response_filters/forbidden" - - $ref: "#/definitions/response_filters/server_error_spreadsheet_info" - stream_data_filters: - - $ref: "#/definitions/response_filters/server_error_stream_data" + response_error_filters: + - $ref: "#/definitions/response_filters/server_error" - $ref: "#/definitions/response_filters/forbidden" + - $ref: "#/definitions/response_filters/not_found" - $ref: "#/definitions/response_filters/rate_limit" schema_type_identifier: key_pointer: diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index d40678969a448..8a366835b610c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -2,12 +2,13 @@ # Copyright (c) 2024 Airbyte, Inc., all rights reserved. # import logging -from typing import Any, Mapping, Optional +import dpath +from typing import Any, Mapping, Optional, List, Iterator from airbyte_cdk.models import ConfiguredAirbyteCatalog from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource from airbyte_cdk.sources.source import TState -from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus +from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus, AirbyteStateMessage, AirbyteMessage """ This file provides the necessary constructs to interpret a provided declarative YAML configuration file into @@ -22,10 +23,12 @@ def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) def check(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteConnectionStatus: - resolver_filters = self.resolved_manifest["dynamic_streams"][0]["components_resolver"]["retriever"]["requester"]["error_handler"][ - "error_handlers" - ][0]["response_filters"] - filters_for_check_operation = self.resolved_manifest["definitions"]["response_filters"]["check_operation_resolver_filters"] - resolver_filters.clear() - resolver_filters.extend(filters_for_check_operation) + manifest_definitions = self.resolved_manifest["definitions"] + dynamic_stream = self.resolved_manifest["dynamic_streams"][0] + retriever_response_filters_path = ["retriever", "requester", "error_handler", "error_handlers", 0, "response_filters"] + + component_resolver_filters_for_check_operation = dpath.get(manifest_definitions, ["response_filters", "check_operation_single_sheet_response_error_filters"], None) + components_resolver_requester_filters_path = ["components_resolver"] + retriever_response_filters_path + dpath.set(dynamic_stream, components_resolver_requester_filters_path, value=component_resolver_filters_for_check_operation) + return super().check(logger, config) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index eadf0c4e200f1..ad0507b537e84 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -4,6 +4,7 @@ import json from copy import deepcopy from typing import Any, Dict, Optional, Tuple +from requests.status_codes import codes as status_codes from unittest import TestCase from unittest.mock import ANY, patch @@ -33,6 +34,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template from source_google_sheets import SourceGoogleSheets +from source_google_sheets.utils import exception_description_by_status_code from .entrypoint_wrapper_helper import check from .request_builder import AuthBuilder, RequestBuilder @@ -195,7 +197,7 @@ def get_stream_data(http_mocker: HttpMocker, data_response_file: str, response_c """" Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' to obtain value ranges (data) for stream from the spreadsheet + sheet provided. - For this we use range [2:202(2 + range in config which default is 200)]. + For this we use range e.g. [2:202(2 + range in config which default is 200)]. We start at 2 as we consider row 1 to contain headers. If we had more data the routine would continue to next ranges. e.g. from response file { @@ -281,13 +283,14 @@ def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMoc @HttpMocker() def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", 404) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) + error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, emitted_at=ANY, error=AirbyteErrorTraceMessage( - message="The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync.", + message=error_message, internal_message=ANY, failure_type=FailureType.system_error, stack_trace=ANY, @@ -305,26 +308,22 @@ def test_check_invalid_creds_json_file(self) -> None: @HttpMocker() def test_check_access_expired(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", 403) - error_message = ( - "The authenticated Google Sheets user does not have permissions to view the " - f"spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access" - " to the Spreadsheet and reauthenticate. If the issue persists, contact support. " - "The caller does not have right permissions." - ) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) + expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, emitted_at=ANY, error=AirbyteErrorTraceMessage( - message=error_message, + message=expected_message, internal_message=ANY, failure_type=FailureType.config_error, stack_trace=ANY, ), ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message + expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_airbyte_message @HttpMocker() def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: @@ -471,14 +470,11 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", 500) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", status_codes.INTERNAL_SERVER_ERROR) with patch("time.sleep"): output = self._discover(self._config, expecting_exception=True) - expected_message = ( - "Could not discover the schema of your spreadsheet. There was an issue with the Google Sheets API." - " This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support. Interval Server error." - ) + expected_message = exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, @@ -516,13 +512,14 @@ def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocke @HttpMocker() def test_discover_404_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", 404) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) output = self._discover(self._config, expecting_exception=True) + error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, emitted_at=ANY, error=AirbyteErrorTraceMessage( - message="The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync.", + message=error_message, internal_message=ANY, failure_type=FailureType.system_error, stack_trace=ANY, @@ -533,27 +530,23 @@ def test_discover_404_error(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_discover_403_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", 403) + GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) output = self._discover(self._config, expecting_exception=True) - error_message = ( - "The authenticated Google Sheets user does not have permissions to view the " - f"spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access" - " to the Spreadsheet and reauthenticate. If the issue persists, contact support. " - "The caller does not have right permissions." - ) + + expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." trace_message = AirbyteTraceMessage( type=TraceType.ERROR, emitted_at=ANY, error=AirbyteErrorTraceMessage( - message=error_message, + message=expected_message, internal_message=ANY, failure_type=FailureType.config_error, stack_trace=ANY, ), ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message + expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_airbyte_message @HttpMocker() def test_given_grid_sheet_type_without_rows_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: @@ -825,9 +818,14 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 9 - assert output.state_messages[0].state.stream.stream_descriptor.name == _STREAM_NAME - assert output.state_messages[1].state.stream.stream_descriptor.name == _B_STREAM_NAME - assert output.state_messages[2].state.stream.stream_descriptor.name == _C_STREAM_NAME + assert len(output.state_messages) == 3 + state_messages_streams = [] + for state_message in output.state_messages: + state_messages_streams.append(state_message.state.stream.stream_descriptor.name) + + assert _STREAM_NAME in state_messages_streams + assert _B_STREAM_NAME in state_messages_streams + assert _C_STREAM_NAME in state_messages_streams expected_messages = [] for current_stream in [_STREAM_NAME, _B_STREAM_NAME, _C_STREAM_NAME]: @@ -872,32 +870,27 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt def test_read_429_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "rate_limit_error", 429) + GoogleSheetSourceTest.get_stream_data(http_mocker, "rate_limit_error", status_codes.TOO_MANY_REQUESTS) configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = ( - "Exception while syncing stream a_stream_name: Stopped syncing process due to rate limits. Rate limit has been reached. Please try later or request a higher quota for your account." - ) + expected_message = f"Exception while syncing stream {_STREAM_NAME}: " + exception_description_by_status_code(status_codes.TOO_MANY_REQUESTS, _STREAM_NAME) + assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() def test_read_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", 403) + GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() - # output = read(self._source, self._config, configured_catalog) output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - - expected_message = ( - f"The authenticated Google Sheets user does not have permissions to view the spreadsheet with id {_SPREADSHEET_ID}. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support. The caller does not have right permissions." - ) + expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." assert output.errors[0].trace.error.message == expected_message @HttpMocker() From 041280a9428708664661eb8f4cf6546b7f2e209c Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 1 Jan 2025 15:57:46 -0600 Subject: [PATCH 16/63] source-google-sheets: fix styles --- .../source_google_sheets/source.py | 10 +- .../unit_tests/integration/test_source.py | 462 ++++++++++++------ 2 files changed, 309 insertions(+), 163 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index 8a366835b610c..0dfd96f6dda53 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -2,13 +2,15 @@ # Copyright (c) 2024 Airbyte, Inc., all rights reserved. # import logging +from typing import Any, Iterator, List, Mapping, Optional + import dpath -from typing import Any, Mapping, Optional, List, Iterator +from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus, AirbyteMessage, AirbyteStateMessage from airbyte_cdk.models import ConfiguredAirbyteCatalog from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource from airbyte_cdk.sources.source import TState -from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus, AirbyteStateMessage, AirbyteMessage + """ This file provides the necessary constructs to interpret a provided declarative YAML configuration file into @@ -27,7 +29,9 @@ def check(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteCon dynamic_stream = self.resolved_manifest["dynamic_streams"][0] retriever_response_filters_path = ["retriever", "requester", "error_handler", "error_handlers", 0, "response_filters"] - component_resolver_filters_for_check_operation = dpath.get(manifest_definitions, ["response_filters", "check_operation_single_sheet_response_error_filters"], None) + component_resolver_filters_for_check_operation = dpath.get( + manifest_definitions, ["response_filters", "check_operation_single_sheet_response_error_filters"], None + ) components_resolver_requester_filters_path = ["components_resolver"] + retriever_response_filters_path dpath.set(dynamic_stream, components_resolver_requester_filters_path, value=component_resolver_filters_for_check_operation) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index ad0507b537e84..a967e11f7617f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -4,11 +4,14 @@ import json from copy import deepcopy from typing import Any, Dict, Optional, Tuple -from requests.status_codes import codes as status_codes from unittest import TestCase from unittest.mock import ANY, patch import pytest +from requests.status_codes import codes as status_codes +from source_google_sheets import SourceGoogleSheets +from source_google_sheets.utils import exception_description_by_status_code + from airbyte_cdk.models import ( AirbyteCatalog, AirbyteConnectionStatus, @@ -33,13 +36,12 @@ from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from source_google_sheets import SourceGoogleSheets -from source_google_sheets.utils import exception_description_by_status_code from .entrypoint_wrapper_helper import check from .request_builder import AuthBuilder, RequestBuilder from .test_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info + _SPREADSHEET_ID = "a_spreadsheet_id" _STREAM_NAME = "a_stream_name" @@ -47,49 +49,47 @@ _C_STREAM_NAME = "c_stream_name" -_CONFIG = { - "spreadsheet_id": _SPREADSHEET_ID, - "credentials": oauth_credentials, - "batch_size": 200 -} +_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": oauth_credentials, "batch_size": 200} -_SERVICE_CONFIG = { - "spreadsheet_id": _SPREADSHEET_ID, - "credentials": service_account_credentials -} +_SERVICE_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": service_account_credentials} GET_SPREADSHEET_INFO = "get_spreadsheet_info" GET_SHEETS_FIRST_ROW = "get_sheet_first_row" GET_STREAM_DATA = "get_stream_data" + def _catalog(sync_mode: SyncMode) -> ConfiguredAirbyteCatalog: return CatalogBuilder().with_stream(_STREAM_NAME, sync_mode).build() + def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceGoogleSheets: return SourceGoogleSheets(catalog=catalog, config=config, state=state) -def _check(config: Dict[str, Any], expecting_exception: bool = False)-> EntrypointOutput: + +def _check(config: Dict[str, Any], expecting_exception: bool = False) -> EntrypointOutput: sync_mode = SyncMode.full_refresh catalog = _catalog(sync_mode) source = _source(catalog=catalog, config=config, state={}) return check(source, config, expecting_exception) -def _discover(config: Dict[str, Any], expecting_exception: bool = False)-> EntrypointOutput: + +def _discover(config: Dict[str, Any], expecting_exception: bool = False) -> EntrypointOutput: sync_mode = SyncMode.full_refresh catalog = _catalog(sync_mode) source = _source(catalog=catalog, config=config, state={}) return discover(source, config, expecting_exception) + def _read( config: Dict[str, Any], catalog: ConfiguredAirbyteCatalog, state: Optional[Dict[str, Any]] = None, expecting_exception: bool = False, ) -> EntrypointOutput: - source = _source(catalog=catalog, config=config, state={}) return read(source, config, catalog, state, expecting_exception) + class GoogleSheetSourceTest(TestCase): def setUp(self) -> None: self._config = deepcopy(_CONFIG) @@ -112,12 +112,14 @@ def authorize(http_mocker: HttpMocker): # Authorization request with user credentials to "https://oauth2.googleapis.com" to obtain a token http_mocker.post( AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_response", __file__)), 200) + HttpResponse(json.dumps(find_template("auth_response", __file__)), 200), ) @staticmethod - def get_spreadsheet_info_and_sheets(http_mocker: HttpMocker, streams_response_file: Optional[str]=None, meta_response_code: Optional[int]=200): - """" + def get_spreadsheet_info_and_sheets( + http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200 + ): + """ " Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order to obtain sheets (streams) from the spreed_sheet_id provided. e.g. from response file @@ -140,12 +142,19 @@ def get_spreadsheet_info_and_sheets(http_mocker: HttpMocker, streams_response_fi if streams_response_file: http_mocker.get( RequestBuilder().with_spreadsheet_id(_SPREADSHEET_ID).with_include_grid_data(False).with_alt("json").build(), - HttpResponse(json.dumps(find_template(streams_response_file, __file__)), meta_response_code) + HttpResponse(json.dumps(find_template(streams_response_file, __file__)), meta_response_code), ) @staticmethod - def get_sheet_first_row(http_mocker: HttpMocker, headers_response_file: str, headers_response_code: int=200, stream_name: Optional[str]=_STREAM_NAME, data_initial_range_response_file: Optional[str]=None, data_initial_response_code: Optional[int]=200): - """" + def get_sheet_first_row( + http_mocker: HttpMocker, + headers_response_file: str, + headers_response_code: int = 200, + stream_name: Optional[str] = _STREAM_NAME, + data_initial_range_response_file: Optional[str] = None, + data_initial_response_code: Optional[int] = 200, + ): + """ " Mock request to 'https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=true&ranges=!1:1&alt=json' to obtain headers data (keys) used for stream schema from the spreadsheet + sheet provided. For this we use range of first row in query. @@ -188,13 +197,24 @@ def get_sheet_first_row(http_mocker: HttpMocker, headers_response_file: str, hea ]}],}]}] """ http_mocker.get( - RequestBuilder().with_spreadsheet_id(_SPREADSHEET_ID).with_include_grid_data(True).with_ranges(f"{stream_name}!1:1").with_alt("json").build(), - HttpResponse(json.dumps(find_template(headers_response_file, __file__)), headers_response_code) + RequestBuilder() + .with_spreadsheet_id(_SPREADSHEET_ID) + .with_include_grid_data(True) + .with_ranges(f"{stream_name}!1:1") + .with_alt("json") + .build(), + HttpResponse(json.dumps(find_template(headers_response_file, __file__)), headers_response_code), ) @staticmethod - def get_stream_data(http_mocker: HttpMocker, data_response_file: str, response_code: int=200, stream_name:Optional[str]=_STREAM_NAME, request_range: Tuple=(2,202) ): - """" + def get_stream_data( + http_mocker: HttpMocker, + data_response_file: str, + response_code: int = 200, + stream_name: Optional[str] = _STREAM_NAME, + request_range: Tuple = (2, 202), + ): + """ " Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' to obtain value ranges (data) for stream from the spreadsheet + sheet provided. For this we use range e.g. [2:202(2 + range in config which default is 200)]. @@ -219,8 +239,13 @@ def get_stream_data(http_mocker: HttpMocker, data_response_file: str, response_c end_range = str(request_range[1]) batch_request_ranges = f"{stream_name}!{start_range}:{end_range}" http_mocker.get( - RequestBuilder.get_account_endpoint().with_spreadsheet_id(_SPREADSHEET_ID).with_ranges(batch_request_ranges).with_major_dimension("ROWS").with_alt("json").build(), - HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code) + RequestBuilder.get_account_endpoint() + .with_spreadsheet_id(_SPREADSHEET_ID) + .with_ranges(batch_request_ranges) + .with_major_dimension("ROWS") + .with_alt("json") + .build(), + HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code), ) @HttpMocker() @@ -245,15 +270,12 @@ def test_given_service_authentication_error_when_check_then_status_is_failed(sel # todo, test this with service credentials wrong_service_account_info = deepcopy(service_account_info) del wrong_service_account_info["client_email"] - wrong_service_account_info_encoded = json.dumps(service_account_info)#.encode("utf-8") + wrong_service_account_info_encoded = json.dumps(service_account_info) # .encode("utf-8") wrong_service_account_credentials = { "auth_type": "Service", "service_account_info": wrong_service_account_info_encoded, } - wrong_config = { - "spreadsheet_id": _SPREADSHEET_ID, - "credentials": wrong_service_account_credentials - } + wrong_config = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": wrong_service_account_credentials} # connection_status = self._source.check(Mock(), wrong_service_account_credentials) output = self._check(wrong_config, expecting_exception=True) @@ -265,7 +287,7 @@ def test_given_service_authentication_error_when_check_then_status_is_failed(sel def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMocker) -> None: http_mocker.post( AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401) + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), ) output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( @@ -273,7 +295,7 @@ def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMoc emitted_at=ANY, error=AirbyteErrorTraceMessage( message="Something went wrong in the connector. See the logs for more details.", - internal_message='401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token', + internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", failure_type=FailureType.system_error, stack_trace=ANY, ), @@ -309,7 +331,9 @@ def test_check_invalid_creds_json_file(self) -> None: @HttpMocker() def test_check_access_expired(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) - expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + expected_message = ( + exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + ) output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( @@ -329,7 +353,9 @@ def test_check_access_expired(self, http_mocker: HttpMocker) -> None: def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_wrong_range", 200) - error_message = f'Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet.' + error_message = ( + f"Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet." + ) output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, @@ -350,7 +376,7 @@ def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) - error_message = f"The following duplicate headers were found in the sheet. Please fix them to continue: ['header1']" + error_message = f"The following duplicate headers were found in the sheet. Please fix them to continue: ['header1']" output = self._check(self._config, expecting_exception=True) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, @@ -370,8 +396,18 @@ def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_s GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "only_headers_range", 200) - expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'header1': {'type': ['null', 'string']}, 'header2': {'type': ['null', 'string']}}, 'type': 'object'} - expected_catalog = AirbyteCatalog(streams=[AirbyteStream(name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False)]) + expected_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": {"header1": {"type": ["null", "string"]}, "header2": {"type": ["null", "string"]}}, + "type": "object", + } + expected_catalog = AirbyteCatalog( + streams=[ + AirbyteStream( + name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False + ) + ] + ) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) output = self._discover(self._config, expecting_exception=False) @@ -380,9 +416,9 @@ def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_s @HttpMocker() def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: expected_schemas_properties = { - _STREAM_NAME: {'age': {'type': ['null', 'string']}, 'name': {'type': ['null', 'string']}}, - _B_STREAM_NAME: {'email': {'type': ['null', 'string']}, 'name': {'type': ['null', 'string']}}, - _C_STREAM_NAME: {'address': {'type': ['null', 'string']}} + _STREAM_NAME: {"age": {"type": ["null", "string"]}, "name": {"type": ["null", "string"]}}, + _B_STREAM_NAME: {"email": {"type": ["null", "string"]}, "name": {"type": ["null", "string"]}}, + _C_STREAM_NAME: {"address": {"type": ["null", "string"]}}, } GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) @@ -391,10 +427,14 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): - expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', - 'properties': expected_stream_properties, - 'type': 'object'} - expected_stream = AirbyteStream(name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + expected_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": expected_stream_properties, + "type": "object", + } + expected_stream = AirbyteStream( + name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False + ) expected_streams.append(expected_stream) expected_catalog = AirbyteCatalog(streams=expected_streams) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) @@ -409,18 +449,21 @@ def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMoc discarded, in this case address and address2 shouldn't be part of the schema. """ expected_schemas_properties = { - _STREAM_NAME: {'name': {'type': ['null', 'string']}, 'age': {'type': ['null', 'string']}}, + _STREAM_NAME: {"name": {"type": ["null", "string"]}, "age": {"type": ["null", "string"]}}, } GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) - expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): - expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', - 'properties': expected_stream_properties, - 'type': 'object'} - expected_stream = AirbyteStream(name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + expected_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": expected_stream_properties, + "type": "object", + } + expected_stream = AirbyteStream( + name=expected_stream_name, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False + ) expected_streams.append(expected_stream) expected_catalog = AirbyteCatalog(streams=expected_streams) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) @@ -434,21 +477,25 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http The response from headers (first row) has columns "header_1 | header_2 | header_2 | address | address2" so header_2 will be ignored from schema. """ - expected_schema_properties = {'header_1': {'type': ['null', 'string']}, 'address': {'type': ['null', 'string']}, 'address2': {'type': ['null', 'string']} + expected_schema_properties = { + "header_1": {"type": ["null", "string"]}, + "address": {"type": ["null", "string"]}, + "address2": {"type": ["null", "string"]}, } test_file_base_name = "discover_duplicated_headers" GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', - 'properties': expected_schema_properties, - 'type': 'object'} - expected_stream = AirbyteStream(name=_STREAM_NAME, json_schema=expected_schema, - supported_sync_modes=[SyncMode.full_refresh], is_resumable=False) + expected_schema = {"$schema": "http://json-schema.org/draft-07/schema#", "properties": expected_schema_properties, "type": "object"} + expected_stream = AirbyteStream( + name=_STREAM_NAME, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False + ) expected_catalog = AirbyteCatalog(streams=[expected_stream]) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) - expected_log_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet. Ignoring them: ['header_2']")) + expected_log_message = AirbyteMessage( + type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet. Ignoring them: ['header_2']") + ) output = self._discover(self._config, expecting_exception=False) @@ -460,8 +507,18 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) - expected_schema = {'$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'_1_test': {'type': ['null', 'string']}, 'header_2': {'type': ['null', 'string']}}, 'type': 'object'} - expected_catalog = AirbyteCatalog(streams=[AirbyteStream(name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False)]) + expected_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": {"_1_test": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}, + "type": "object", + } + expected_catalog = AirbyteCatalog( + streams=[ + AirbyteStream( + name="a_stream_name", json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False + ) + ] + ) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) self._config["names_conversion"] = True @@ -480,7 +537,7 @@ def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: type=TraceType.ERROR, emitted_at=ANY, error=AirbyteErrorTraceMessage( - message='Something went wrong in the connector. See the logs for more details.', + message="Something went wrong in the connector. See the logs for more details.", internal_message=expected_message, failure_type=FailureType.system_error, stack_trace=ANY, @@ -493,7 +550,7 @@ def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocker) -> None: http_mocker.post( AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401) + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), ) trace_message = AirbyteTraceMessage( @@ -501,7 +558,7 @@ def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocke emitted_at=ANY, error=AirbyteErrorTraceMessage( message="Something went wrong in the connector. See the logs for more details.", - internal_message='401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token', + internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", failure_type=FailureType.system_error, stack_trace=ANY, ), @@ -533,7 +590,9 @@ def test_discover_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) output = self._discover(self._config, expecting_exception=True) - expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + expected_message = ( + exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + ) trace_message = AirbyteTraceMessage( type=TraceType.ERROR, @@ -567,26 +626,32 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") first_property = "header_1" second_property = "header_2" - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {first_property: { "type": ["null", "string"] }, second_property: { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema( + {"properties": {first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}}} + ) + ) + .build() + ) - output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) expected_records = [ AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( - emitted_at=ANY, - stream=_STREAM_NAME, - data={first_property: 'value_11', second_property: 'value_12'} - ) + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_11", second_property: "value_12"} + ), ), AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( - emitted_at=ANY, - stream=_STREAM_NAME, - data={first_property: 'value_21', second_property: 'value_22'} - ) - ) + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_21", second_property: "value_22"} + ), + ), ] assert len(output.records) == 2 assert output.records == expected_records @@ -603,34 +668,39 @@ def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocke GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") first_property = "header_1" second_property = "header_2" - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( - {"properties": {first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema( + {"properties": {first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}}} + ) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) expected_records = [ AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( - emitted_at=ANY, - stream=_STREAM_NAME, - data={first_property: 'value_11', second_property: 'value_12'} - ) + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_11", second_property: "value_12"} + ), ), AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( - emitted_at=ANY, - stream=_STREAM_NAME, - data={first_property: 'value_21', second_property: 'value_22'} - ) - ) + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_21", second_property: "value_22"} + ), + ), ] assert len(output.records) == 2 assert output.records == expected_records @HttpMocker() def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker: HttpMocker): - """" + """ " header_2 will be ignored from records as column is duplicated. header_1 header_2 header_2 address address2 @@ -646,13 +716,23 @@ def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker first_property = "header_1" second_property = "address" third_property = "address2" - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( - {"properties": {first_property: {"type": ["null", "string"]}, + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema( + { + "properties": { + first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}, third_property: {"type": ["null", "string"]}, - }}) - - ).build() + } + } + ) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) expected_records = [ @@ -661,24 +741,24 @@ def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker record=AirbyteRecordMessage( emitted_at=ANY, stream=_STREAM_NAME, - data={first_property: 'value_11', second_property: 'main', third_property: 'main st'} - ) + data={first_property: "value_11", second_property: "main", third_property: "main st"}, + ), ), AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( emitted_at=ANY, stream=_STREAM_NAME, - data={first_property: 'value_21', second_property: 'washington 3', third_property: 'colonial'} - ) - ) + data={first_property: "value_21", second_property: "washington 3", third_property: "colonial"}, + ), + ), ] assert len(output.records) == 2 assert output.records == expected_records @HttpMocker() def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): - """" + """ " There are a few empty rows in the response that we shuld ignore e.g. @@ -701,10 +781,11 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): catalog_properties = {} for property in expected_properties: catalog_properties[property] = {"type": ["null", "string"]} - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( - {"properties": catalog_properties}) - - ).build() + configured_catalog = ( + CatalogBuilder() + .with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": catalog_properties})) + .build() + ) records_in_response = find_template(f"{test_file_base_name}_{GET_STREAM_DATA}", __file__) empty_row_count = 0 @@ -716,13 +797,13 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): if row: expected_records += [ AirbyteMessage( - type=Type.RECORD, - record=AirbyteRecordMessage( - emitted_at=ANY, - stream=_STREAM_NAME, - data={expected_property:row_value for expected_property,row_value in zip(expected_properties, row)} - ) - ) + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, + stream=_STREAM_NAME, + data={expected_property: row_value for expected_property, row_value in zip(expected_properties, row)}, + ), + ) ] else: empty_row_count += 1 @@ -742,14 +823,18 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): end_range = start_range + batch_size request_range = (start_range, end_range) - GoogleSheetSourceTest.get_stream_data(http_mocker, data_response_file=f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", request_range=request_range) + GoogleSheetSourceTest.get_stream_data( + http_mocker, data_response_file=f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", request_range=request_range + ) start_range += batch_size + 1 catalog_properties = {} for expected_property in ["id", "name", "normalized_name"]: catalog_properties[expected_property] = {"type": ["null", "string"]} - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema( - {"properties": catalog_properties}) - ).build() + configured_catalog = ( + CatalogBuilder() + .with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": catalog_properties})) + .build() + ) self._config["batch_size"] = batch_size output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) > 0 @@ -763,27 +848,42 @@ def test_when_read_then_return_records_with_name_conversion(self, http_mocker: H first_expected_converted_property = "_1_test" second_expected_converted_property = "header_2" - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {first_expected_converted_property: { "type": ["null", "string"] }, second_expected_converted_property: { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema( + { + "properties": { + first_expected_converted_property: {"type": ["null", "string"]}, + second_expected_converted_property: {"type": ["null", "string"]}, + } + } + ) + ) + .build() + ) self._config["names_conversion"] = True - output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) expected_records = [ AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( emitted_at=ANY, stream=_STREAM_NAME, - data={first_expected_converted_property: 'value_11', second_expected_converted_property: 'value_12'} - ) + data={first_expected_converted_property: "value_11", second_expected_converted_property: "value_12"}, + ), ), AirbyteMessage( type=Type.RECORD, record=AirbyteRecordMessage( emitted_at=ANY, stream=_STREAM_NAME, - data={first_expected_converted_property: 'value_21', second_expected_converted_property: 'value_22'} - ) - ) + data={first_expected_converted_property: "value_21", second_expected_converted_property: "value_22"}, + ), + ), ] assert len(output.records) == 2 assert output.records == expected_records @@ -800,20 +900,23 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range_2", stream_name=_C_STREAM_NAME) - configured_catalog = (CatalogBuilder().with_stream( - ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME). - with_json_schema({"properties": {'age': {'type': 'string'}, 'name': {'type': 'string'}} - }) - ).with_stream( - ConfiguredAirbyteStreamBuilder().with_name(_B_STREAM_NAME). - with_json_schema({"properties": {'email': {'type': 'string'}, 'name': {'type': 'string'}} - }) - ).with_stream( - ConfiguredAirbyteStreamBuilder().with_name(_C_STREAM_NAME). - with_json_schema({"properties": {'address': {'type': 'string'}} - }) - ) - .build()) + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"age": {"type": "string"}, "name": {"type": "string"}}}) + ) + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_B_STREAM_NAME) + .with_json_schema({"properties": {"email": {"type": "string"}, "name": {"type": "string"}}}) + ) + .with_stream( + ConfiguredAirbyteStreamBuilder().with_name(_C_STREAM_NAME).with_json_schema({"properties": {"address": {"type": "string"}}}) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 9 @@ -830,19 +933,9 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker expected_messages = [] for current_stream in [_STREAM_NAME, _B_STREAM_NAME, _C_STREAM_NAME]: for current_status in [AirbyteStreamStatus.COMPLETE, AirbyteStreamStatus.RUNNING, AirbyteStreamStatus.STARTED]: - stream_descriptor = StreamDescriptor( - name=current_stream, - namespace=None - ) - stream_status = AirbyteStreamStatusTraceMessage( - status= current_status, - stream_descriptor=stream_descriptor - ) - airbyte_trace_message = AirbyteTraceMessage( - type=TraceType.STREAM_STATUS, - emitted_at=ANY, - stream_status= stream_status - ) + stream_descriptor = StreamDescriptor(name=current_stream, namespace=None) + stream_status = AirbyteStreamStatusTraceMessage(status=current_status, stream_descriptor=stream_descriptor) + airbyte_trace_message = AirbyteTraceMessage(type=TraceType.STREAM_STATUS, emitted_at=ANY, stream_status=stream_status) airbyte_message = AirbyteMessage(type=Type.TRACE, trace=airbyte_trace_message) expected_messages.append(airbyte_message) assert len(output.trace_messages) == len(expected_messages) @@ -855,7 +948,15 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) == 5 @@ -872,12 +973,22 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "rate_limit_error", status_codes.TOO_MANY_REQUESTS) - configured_catalog =CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = f"Exception while syncing stream {_STREAM_NAME}: " + exception_description_by_status_code(status_codes.TOO_MANY_REQUESTS, _STREAM_NAME) + expected_message = f"Exception while syncing stream {_STREAM_NAME}: " + exception_description_by_status_code( + status_codes.TOO_MANY_REQUESTS, _STREAM_NAME + ) assert output.errors[0].trace.error.internal_message == expected_message @@ -887,10 +998,20 @@ def test_read_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + expected_message = ( + exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." + ) assert output.errors[0].trace.error.message == expected_message @HttpMocker() @@ -899,14 +1020,20 @@ def test_read_500_error(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) GoogleSheetSourceTest.get_stream_data(http_mocker, "internal_server_error", 500) - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = ( - "Exception while syncing stream a_stream_name: There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support" - ) + expected_message = "Exception while syncing stream a_stream_name: There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support" assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() @@ -914,7 +1041,15 @@ def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( @@ -927,7 +1062,15 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) - configured_catalog = CatalogBuilder().with_stream(ConfiguredAirbyteStreamBuilder().with_name(_STREAM_NAME).with_json_schema({"properties": {"header_1": { "type": ["null", "string"] }, "header_2": { "type": ["null", "string"] }}})).build() + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( @@ -935,7 +1078,6 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: ) assert output.errors[0].trace.error.message == expected_message - @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): pass From 00edfb40160046d3cd1c61bb51ca2b681dd5c882 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 1 Jan 2025 17:52:12 -0600 Subject: [PATCH 17/63] source-google-sheets: split tests in different files per type --- .../source_google_sheets/manifest.yaml | 2 + .../integration/google_sheets_base_test.py | 186 ++++++ ...est_credentials.py => mock_credentials.py} | 0 .../integration/protocol_helpers.py | 48 ++ .../integration/test_auth_credentials.py | 120 ++++ .../integration/test_exception_description.py | 215 +++++++ .../unit_tests/integration/test_source.py | 544 ++---------------- .../unit_tests/test_stream.py | 379 ------------ .../unit_tests/test_utils.py | 21 - 9 files changed, 628 insertions(+), 887 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{test_credentials.py => mock_credentials.py} (100%) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_stream.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 3013b6e0e434c..eaa47cde7728b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -269,6 +269,8 @@ definitions: action: RETRY http_codes: - 500 + - 502 + - 503 error_message: >- There was an issue with the Google Sheets API. This is usually a temporary issue from diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py new file mode 100644 index 0000000000000..a69990a2708f1 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -0,0 +1,186 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + + +import json +from abc import ABC +from copy import deepcopy +from typing import Any, Dict, Optional, Tuple +from unittest import TestCase + +from airbyte_cdk.models import ( + ConfiguredAirbyteCatalog, +) +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput +from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse +from airbyte_cdk.test.mock_http.response_builder import find_template + +from .request_builder import AuthBuilder, RequestBuilder +from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials +from .protocol_helpers import check_helper, discover_helper, read_helper + +_SPREADSHEET_ID = "a_spreadsheet_id" + +_STREAM_NAME = "a_stream_name" + +_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": oauth_credentials, "batch_size": 200} + +_SERVICE_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": service_account_credentials} + + +class GoogleSheetsBaseTest(TestCase, ABC): + def setUp(self) -> None: + self._config = deepcopy(_CONFIG) + self._service_config = deepcopy(_SERVICE_CONFIG) + + @staticmethod + def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: + return check_helper(config, stream_name=_STREAM_NAME, expecting_exception=expecting_exception) + + @staticmethod + def _discover(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: + return discover_helper(config, stream_name=_STREAM_NAME, expecting_exception=expecting_exception) + + @staticmethod + def _read(config: Dict[str, Any], catalog: ConfiguredAirbyteCatalog, expecting_exception: bool = False) -> EntrypointOutput: + return read_helper(config, catalog, expecting_exception=expecting_exception) + + @staticmethod + def authorize(http_mocker: HttpMocker): + # Authorization request with user credentials to "https://oauth2.googleapis.com" to obtain a token + http_mocker.post( + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), + HttpResponse(json.dumps(find_template("auth_response", __file__)), 200), + ) + + @staticmethod + def get_spreadsheet_info_and_sheets( + http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200 + ): + """ " + Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order + to obtain sheets (streams) from the spreed_sheet_id provided. + e.g. from response file + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 1, + "columnCount": 1 + } + } + } + ], + """ + GoogleSheetsBaseTest.authorize(http_mocker) + if streams_response_file: + http_mocker.get( + RequestBuilder().with_spreadsheet_id(_SPREADSHEET_ID).with_include_grid_data(False).with_alt("json").build(), + HttpResponse(json.dumps(find_template(streams_response_file, __file__)), meta_response_code), + ) + + @staticmethod + def get_sheet_first_row( + http_mocker: HttpMocker, + headers_response_file: str, + headers_response_code: int = 200, + stream_name: Optional[str] = _STREAM_NAME, + data_initial_range_response_file: Optional[str] = None, + data_initial_response_code: Optional[int] = 200, + ): + """ " + Mock request to 'https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=true&ranges=!1:1&alt=json' + to obtain headers data (keys) used for stream schema from the spreadsheet + sheet provided. + For this we use range of first row in query. + e.g. from response file + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": , + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 4, + "columnCount": 2 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name" + }, + { + "userEnteredValue": { + "stringValue": "age" + }, + "effectiveValue": { + "stringValue": "age" + }, + "formattedValue": "age" + } + ]}],}]}] + """ + http_mocker.get( + RequestBuilder() + .with_spreadsheet_id(_SPREADSHEET_ID) + .with_include_grid_data(True) + .with_ranges(f"{stream_name}!1:1") + .with_alt("json") + .build(), + HttpResponse(json.dumps(find_template(headers_response_file, __file__)), headers_response_code), + ) + + @staticmethod + def get_stream_data( + http_mocker: HttpMocker, + data_response_file: str, + response_code: int = 200, + stream_name: Optional[str] = _STREAM_NAME, + request_range: Tuple = (2, 202), + ): + """ " + Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' + to obtain value ranges (data) for stream from the spreadsheet + sheet provided. + For this we use range e.g. [2:202(2 + range in config which default is 200)]. + We start at 2 as we consider row 1 to contain headers. If we had more data the routine would continue to next ranges. + e.g. from response file + { + "spreadsheetId": "", + "valueRanges": [ + { + "range": "!A2:B4", + "majorDimension": "ROWS", + "values": [ + ["name1", "22"], + ["name2", "24"], + ["name3", "25"] + ] + } + ] + } + """ + start_range = str(request_range[0]) + end_range = str(request_range[1]) + batch_request_ranges = f"{stream_name}!{start_range}:{end_range}" + http_mocker.get( + RequestBuilder.get_account_endpoint() + .with_spreadsheet_id(_SPREADSHEET_ID) + .with_ranges(batch_request_ranges) + .with_major_dimension("ROWS") + .with_alt("json") + .build(), + HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code), + ) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py similarity index 100% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_credentials.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py new file mode 100644 index 0000000000000..f9b816e8e0c40 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + + +from typing import Any, Dict, Optional, Tuple +from source_google_sheets import SourceGoogleSheets + +from airbyte_cdk.models import ( + ConfiguredAirbyteCatalog, + SyncMode +) +from airbyte_cdk.test.catalog_builder import CatalogBuilder +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read + + +from .entrypoint_wrapper_helper import check + + + +def _catalog(sync_mode: SyncMode, stream_name: str) -> ConfiguredAirbyteCatalog: + return CatalogBuilder().with_stream(stream_name, sync_mode).build() + + +def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceGoogleSheets: + return SourceGoogleSheets(catalog=catalog, config=config, state=state) + + +def check_helper(config: Dict[str, Any], stream_name: str, expecting_exception: bool = False) -> EntrypointOutput: + sync_mode = SyncMode.full_refresh + catalog = _catalog(sync_mode, stream_name) + source = _source(catalog=catalog, config=config, state={}) + return check(source, config, expecting_exception) + + +def discover_helper(config: Dict[str, Any], stream_name: str, expecting_exception: bool = False) -> EntrypointOutput: + sync_mode = SyncMode.full_refresh + catalog = _catalog(sync_mode, stream_name) + source = _source(catalog=catalog, config=config, state={}) + return discover(source, config, expecting_exception) + + +def read_helper( + config: Dict[str, Any], + catalog: ConfiguredAirbyteCatalog, + state: Optional[Dict[str, Any]] = None, + expecting_exception: bool = False, +) -> EntrypointOutput: + source = _source(catalog=catalog, config=config, state={}) + return read(source, config, catalog, state, expecting_exception) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py new file mode 100644 index 0000000000000..20d90e3bd5a3b --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -0,0 +1,120 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + + +import json +from copy import deepcopy +from unittest.mock import ANY, patch + +import pytest + +from airbyte_cdk.models import ( + AirbyteConnectionStatus, + AirbyteErrorTraceMessage, + AirbyteMessage, + AirbyteTraceMessage, + FailureType, + Status, + TraceType, + Type, +) + +from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse +from airbyte_cdk.test.mock_http.response_builder import find_template + +from .google_sheets_base_test import GoogleSheetsBaseTest +from .request_builder import AuthBuilder, RequestBuilder +from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info + +_SPREADSHEET_ID = "a_spreadsheet_id" + +_STREAM_NAME = "a_stream_name" +_B_STREAM_NAME = "b_stream_name" +_C_STREAM_NAME = "c_stream_name" + + +_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": oauth_credentials, "batch_size": 200} + +_SERVICE_CONFIG = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": service_account_credentials} + +GET_SPREADSHEET_INFO = "get_spreadsheet_info" +GET_SHEETS_FIRST_ROW = "get_sheet_first_row" +GET_STREAM_DATA = "get_stream_data" + + +class TestCredentials(GoogleSheetsBaseTest): + + def test_given_authentication_error_when_check_then_status_is_failed(self) -> None: + del self._config["credentials"]["client_secret"] + + output = self._check(self._config, expecting_exception=False) + msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'Service' was expected") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message + + @pytest.mark.skip("Need service credentials to test this behavior") + def test_given_service_authentication_error_when_check_then_status_is_failed(self) -> None: + # todo, test this with service credentials + wrong_service_account_info = deepcopy(service_account_info) + del wrong_service_account_info["client_email"] + wrong_service_account_info_encoded = json.dumps(service_account_info) # .encode("utf-8") + wrong_service_account_credentials = { + "auth_type": "Service", + "service_account_info": wrong_service_account_info_encoded, + } + wrong_config = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": wrong_service_account_credentials} + # connection_status = self._source.check(Mock(), wrong_service_account_credentials) + output = self._check(wrong_config, expecting_exception=True) + + msg = AirbyteConnectionStatus(status=Status.FAILED, message="") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message + + @HttpMocker() + def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMocker) -> None: + http_mocker.post( + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), + ) + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="Something went wrong in the connector. See the logs for more details.", + internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message + + + + def test_check_invalid_creds_json_file(self) -> None: + invalid_creds_json_file = {} + output = self._check(invalid_creds_json_file, expecting_exception=True) + msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'spreadsheet_id' is a required property") + expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) + assert output._messages[-1] == expected_message + + @HttpMocker() + def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocker) -> None: + http_mocker.post( + AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), + HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), + ) + + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="Something went wrong in the connector. See the logs for more details.", + internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + output = self._discover(self._config, expecting_exception=True) + assert output.errors[-1] == expected_message diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py new file mode 100644 index 0000000000000..3a2d4286831cc --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -0,0 +1,215 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + + +from unittest.mock import ANY, patch + +from requests.status_codes import codes as status_codes + +from airbyte_cdk.models import ( + AirbyteErrorTraceMessage, + AirbyteMessage, + AirbyteTraceMessage, + FailureType, + TraceType, + Type, +) +from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder +from airbyte_cdk.test.mock_http import HttpMocker + +from .google_sheets_base_test import GoogleSheetsBaseTest + +_SPREADSHEET_ID = "a_spreadsheet_id" + +_STREAM_NAME = "a_stream_name" + +def exception_description_by_status_code(code: int, spreadsheet_id) -> str: + if code in [status_codes.INTERNAL_SERVER_ERROR, status_codes.BAD_GATEWAY, status_codes.SERVICE_UNAVAILABLE]: + return ( + "There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side." + " Please try again. If this issue persists, contact support" + ) + if code == status_codes.FORBIDDEN: + return ( + f"The authenticated Google Sheets user does not have permissions to view the spreadsheet with id {spreadsheet_id}. " + "Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support" + ) + if code == status_codes.NOT_FOUND: + return ( + f"The requested Google Sheets spreadsheet with id {spreadsheet_id} does not exist. " + f"Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support" + ) + + if code == status_codes.TOO_MANY_REQUESTS: + return "Rate limit has been reached. Please try later or request a higher quota for your account." + + return "" + +class TestExceptionDescriptionByStatusCode(GoogleSheetsBaseTest): + @HttpMocker() + def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) + error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message + + @HttpMocker() + def test_check_access_expired(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) + expected_message = ( + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + ) + + output = self._check(self._config, expecting_exception=True) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=expected_message, + internal_message=ANY, + failure_type=FailureType.config_error, + stack_trace=ANY, + ), + ) + expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_airbyte_message + + @HttpMocker() + def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", status_codes.INTERNAL_SERVER_ERROR) + + with patch("time.sleep"): + output = self._discover(self._config, expecting_exception=True) + expected_message = exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID) + + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message="Something went wrong in the connector. See the logs for more details.", + internal_message=expected_message, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message + + @HttpMocker() + def test_discover_404_error(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) + output = self._discover(self._config, expecting_exception=True) + error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=error_message, + internal_message=ANY, + failure_type=FailureType.system_error, + stack_trace=ANY, + ), + ) + expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_message + + @HttpMocker() + def test_discover_403_error(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) + output = self._discover(self._config, expecting_exception=True) + + expected_message = ( + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + ) + + trace_message = AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=ANY, + error=AirbyteErrorTraceMessage( + message=expected_message, + internal_message=ANY, + failure_type=FailureType.config_error, + stack_trace=ANY, + ), + ) + expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) + assert output.errors[-1] == expected_airbyte_message + + @HttpMocker() + def test_read_429_error(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", 200) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "rate_limit_error", status_codes.TOO_MANY_REQUESTS) + + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) + + with patch("time.sleep"): + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) + + expected_message = f"Exception while syncing stream {_STREAM_NAME}: {exception_description_by_status_code(status_codes.TOO_MANY_REQUESTS, _STREAM_NAME)}" + + assert output.errors[0].trace.error.internal_message == expected_message + + + @HttpMocker() + def test_read_403_error(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", 200) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) + + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) + + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) + expected_message = ( + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + ) + assert output.errors[0].trace.error.message == expected_message + + + @HttpMocker() + def test_read_500_error(self, http_mocker: HttpMocker) -> None: + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", 200) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "internal_server_error", status_codes.INTERNAL_SERVER_ERROR) + + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) + ) + .build() + ) + + with patch("time.sleep"): + output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) + + expected_message = f"Exception while syncing stream a_stream_name: {exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID)}" + assert output.errors[0].trace.error.internal_message == expected_message diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index a967e11f7617f..b422f298d93a6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -9,7 +9,6 @@ import pytest from requests.status_codes import codes as status_codes -from source_google_sheets import SourceGoogleSheets from source_google_sheets.utils import exception_description_by_status_code from airbyte_cdk.models import ( @@ -33,14 +32,14 @@ ) from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder -from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from .entrypoint_wrapper_helper import check +from .google_sheets_base_test import GoogleSheetsBaseTest from .request_builder import AuthBuilder, RequestBuilder -from .test_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info - +from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info +from .protocol_helpers import check_helper, discover_helper, read_helper _SPREADSHEET_ID = "a_spreadsheet_id" @@ -58,301 +57,22 @@ GET_STREAM_DATA = "get_stream_data" -def _catalog(sync_mode: SyncMode) -> ConfiguredAirbyteCatalog: - return CatalogBuilder().with_stream(_STREAM_NAME, sync_mode).build() - - -def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceGoogleSheets: - return SourceGoogleSheets(catalog=catalog, config=config, state=state) - - -def _check(config: Dict[str, Any], expecting_exception: bool = False) -> EntrypointOutput: - sync_mode = SyncMode.full_refresh - catalog = _catalog(sync_mode) - source = _source(catalog=catalog, config=config, state={}) - return check(source, config, expecting_exception) - - -def _discover(config: Dict[str, Any], expecting_exception: bool = False) -> EntrypointOutput: - sync_mode = SyncMode.full_refresh - catalog = _catalog(sync_mode) - source = _source(catalog=catalog, config=config, state={}) - return discover(source, config, expecting_exception) - - -def _read( - config: Dict[str, Any], - catalog: ConfiguredAirbyteCatalog, - state: Optional[Dict[str, Any]] = None, - expecting_exception: bool = False, -) -> EntrypointOutput: - source = _source(catalog=catalog, config=config, state={}) - return read(source, config, catalog, state, expecting_exception) - - -class GoogleSheetSourceTest(TestCase): - def setUp(self) -> None: - self._config = deepcopy(_CONFIG) - self._service_config = deepcopy(_SERVICE_CONFIG) - - @staticmethod - def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: - return _check(config, expecting_exception=expecting_exception) - - @staticmethod - def _discover(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: - return _discover(config, expecting_exception=expecting_exception) - - @staticmethod - def _read(config: Dict[str, Any], catalog: ConfiguredAirbyteCatalog, expecting_exception: bool = False) -> EntrypointOutput: - return _read(config, catalog, expecting_exception=expecting_exception) - - @staticmethod - def authorize(http_mocker: HttpMocker): - # Authorization request with user credentials to "https://oauth2.googleapis.com" to obtain a token - http_mocker.post( - AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_response", __file__)), 200), - ) - - @staticmethod - def get_spreadsheet_info_and_sheets( - http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200 - ): - """ " - Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order - to obtain sheets (streams) from the spreed_sheet_id provided. - e.g. from response file - "sheets": [ - { - "properties": { - "sheetId": 0, - "title": "", - "index": 0, - "sheetType": "GRID", - "gridProperties": { - "rowCount": 1, - "columnCount": 1 - } - } - } - ], - """ - GoogleSheetSourceTest.authorize(http_mocker) - if streams_response_file: - http_mocker.get( - RequestBuilder().with_spreadsheet_id(_SPREADSHEET_ID).with_include_grid_data(False).with_alt("json").build(), - HttpResponse(json.dumps(find_template(streams_response_file, __file__)), meta_response_code), - ) - - @staticmethod - def get_sheet_first_row( - http_mocker: HttpMocker, - headers_response_file: str, - headers_response_code: int = 200, - stream_name: Optional[str] = _STREAM_NAME, - data_initial_range_response_file: Optional[str] = None, - data_initial_response_code: Optional[int] = 200, - ): - """ " - Mock request to 'https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=true&ranges=!1:1&alt=json' - to obtain headers data (keys) used for stream schema from the spreadsheet + sheet provided. - For this we use range of first row in query. - e.g. from response file - "sheets": [ - { - "properties": { - "sheetId": 0, - "title": , - "index": 0, - "sheetType": "GRID", - "gridProperties": { - "rowCount": 4, - "columnCount": 2 - } - }, - "data": [ - { - "rowData": [ - { - "values": [ - { - "userEnteredValue": { - "stringValue": "name" - }, - "effectiveValue": { - "stringValue": "name" - }, - "formattedValue": "name" - }, - { - "userEnteredValue": { - "stringValue": "age" - }, - "effectiveValue": { - "stringValue": "age" - }, - "formattedValue": "age" - } - ]}],}]}] - """ - http_mocker.get( - RequestBuilder() - .with_spreadsheet_id(_SPREADSHEET_ID) - .with_include_grid_data(True) - .with_ranges(f"{stream_name}!1:1") - .with_alt("json") - .build(), - HttpResponse(json.dumps(find_template(headers_response_file, __file__)), headers_response_code), - ) - - @staticmethod - def get_stream_data( - http_mocker: HttpMocker, - data_response_file: str, - response_code: int = 200, - stream_name: Optional[str] = _STREAM_NAME, - request_range: Tuple = (2, 202), - ): - """ " - Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' - to obtain value ranges (data) for stream from the spreadsheet + sheet provided. - For this we use range e.g. [2:202(2 + range in config which default is 200)]. - We start at 2 as we consider row 1 to contain headers. If we had more data the routine would continue to next ranges. - e.g. from response file - { - "spreadsheetId": "", - "valueRanges": [ - { - "range": "!A2:B4", - "majorDimension": "ROWS", - "values": [ - ["name1", "22"], - ["name2", "24"], - ["name3", "25"] - ] - } - ] - } - """ - start_range = str(request_range[0]) - end_range = str(request_range[1]) - batch_request_ranges = f"{stream_name}!{start_range}:{end_range}" - http_mocker.get( - RequestBuilder.get_account_endpoint() - .with_spreadsheet_id(_SPREADSHEET_ID) - .with_ranges(batch_request_ranges) - .with_major_dimension("ROWS") - .with_alt("json") - .build(), - HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code), - ) +class TestSource(GoogleSheetsBaseTest): @HttpMocker() def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_succeeded_range") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") + TestSource.get_sheet_first_row(http_mocker, "check_succeeded_range") output = self._check(self._config, expecting_exception=False) expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) assert output.logs[-1] == expected_message - def test_given_authentication_error_when_check_then_status_is_failed(self) -> None: - del self._config["credentials"]["client_secret"] - - output = self._check(self._config, expecting_exception=False) - msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'Service' was expected") - expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) - assert output._messages[-1] == expected_message - - @pytest.mark.skip("Need service credentials to test this behavior") - def test_given_service_authentication_error_when_check_then_status_is_failed(self) -> None: - # todo, test this with service credentials - wrong_service_account_info = deepcopy(service_account_info) - del wrong_service_account_info["client_email"] - wrong_service_account_info_encoded = json.dumps(service_account_info) # .encode("utf-8") - wrong_service_account_credentials = { - "auth_type": "Service", - "service_account_info": wrong_service_account_info_encoded, - } - wrong_config = {"spreadsheet_id": _SPREADSHEET_ID, "credentials": wrong_service_account_credentials} - # connection_status = self._source.check(Mock(), wrong_service_account_credentials) - output = self._check(wrong_config, expecting_exception=True) - - msg = AirbyteConnectionStatus(status=Status.FAILED, message="") - expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) - assert output._messages[-1] == expected_message - - @HttpMocker() - def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMocker) -> None: - http_mocker.post( - AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), - ) - output = self._check(self._config, expecting_exception=True) - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message="Something went wrong in the connector. See the logs for more details.", - internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", - failure_type=FailureType.system_error, - stack_trace=ANY, - ), - ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message - - @HttpMocker() - def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) - error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) - output = self._check(self._config, expecting_exception=True) - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message=error_message, - internal_message=ANY, - failure_type=FailureType.system_error, - stack_trace=ANY, - ), - ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message - - def test_check_invalid_creds_json_file(self) -> None: - invalid_creds_json_file = {} - output = self._check(invalid_creds_json_file, expecting_exception=True) - msg = AirbyteConnectionStatus(status=Status.FAILED, message="Config validation error: 'spreadsheet_id' is a required property") - expected_message = AirbyteMessage(type=Type.CONNECTION_STATUS, connectionStatus=msg) - assert output._messages[-1] == expected_message - - @HttpMocker() - def test_check_access_expired(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) - expected_message = ( - exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." - ) - - output = self._check(self._config, expecting_exception=True) - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message=expected_message, - internal_message=ANY, - failure_type=FailureType.config_error, - stack_trace=ANY, - ), - ) - expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_airbyte_message @HttpMocker() def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_wrong_range", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "check_wrong_range", 200) error_message = ( f"Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet." ) @@ -373,8 +93,8 @@ def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) @HttpMocker() def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: # With headers, we refer to properties that will be used for schema - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) error_message = f"The following duplicate headers were found in the sheet. Please fix them to continue: ['header1']" output = self._check(self._config, expecting_exception=True) @@ -393,8 +113,8 @@ def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "only_headers_range", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "only_headers_range", 200) expected_schema = { "$schema": "http://json-schema.org/draft-07/schema#", @@ -420,10 +140,10 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: _B_STREAM_NAME: {"email": {"type": ["null", "string"]}, "name": {"type": ["null", "string"]}}, _C_STREAM_NAME: {"address": {"type": ["null", "string"]}}, } - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): @@ -451,8 +171,8 @@ def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMoc expected_schemas_properties = { _STREAM_NAME: {"name": {"type": ["null", "string"]}, "age": {"type": ["null", "string"]}}, } - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) + TestSource.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): @@ -483,8 +203,8 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http "address2": {"type": ["null", "string"]}, } test_file_base_name = "discover_duplicated_headers" - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") expected_schema = {"$schema": "http://json-schema.org/draft-07/schema#", "properties": expected_schema_properties, "type": "object"} expected_stream = AirbyteStream( @@ -505,8 +225,8 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "names_conversion_range", 200) expected_schema = { "$schema": "http://json-schema.org/draft-07/schema#", "properties": {"_1_test": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}, @@ -525,105 +245,23 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: output = self._discover(self._config, expecting_exception=False) assert output.catalog == expected_message - @HttpMocker() - def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "internal_server_error", status_codes.INTERNAL_SERVER_ERROR) - - with patch("time.sleep"): - output = self._discover(self._config, expecting_exception=True) - expected_message = exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID) - - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message="Something went wrong in the connector. See the logs for more details.", - internal_message=expected_message, - failure_type=FailureType.system_error, - stack_trace=ANY, - ), - ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message - - @HttpMocker() - def test_discover_invalid_credentials_error_message(self, http_mocker: HttpMocker) -> None: - http_mocker.post( - AuthBuilder.get_token_endpoint().with_body(AUTH_BODY).build(), - HttpResponse(json.dumps(find_template("auth_invalid_client", __file__)), 401), - ) - - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message="Something went wrong in the connector. See the logs for more details.", - internal_message="401 Client Error: None for url: https://www.googleapis.com/oauth2/v4/token", - failure_type=FailureType.system_error, - stack_trace=ANY, - ), - ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - output = self._discover(self._config, expecting_exception=True) - assert output.errors[-1] == expected_message - - @HttpMocker() - def test_discover_404_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) - output = self._discover(self._config, expecting_exception=True) - error_message = exception_description_by_status_code(status_codes.NOT_FOUND, _SPREADSHEET_ID) - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message=error_message, - internal_message=ANY, - failure_type=FailureType.system_error, - stack_trace=ANY, - ), - ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message - - @HttpMocker() - def test_discover_403_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) - output = self._discover(self._config, expecting_exception=True) - - expected_message = ( - exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." - ) - - trace_message = AirbyteTraceMessage( - type=TraceType.ERROR, - emitted_at=ANY, - error=AirbyteErrorTraceMessage( - message=expected_message, - internal_message=ANY, - failure_type=FailureType.config_error, - stack_trace=ANY, - ), - ) - expected_airbyte_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_airbyte_message - @HttpMocker() def test_given_grid_sheet_type_without_rows_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) output = self._discover(self._config, expecting_exception=False) assert len(output.catalog.catalog.streams) == 0 @HttpMocker() def test_given_not_grid_sheet_type_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) output = self._discover(self._config, expecting_exception=False) assert len(output.catalog.catalog.streams) == 0 @HttpMocker() def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range") - GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + TestSource.get_sheet_first_row(http_mocker, "read_records_range") + TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions") first_property = "header_1" second_property = "header_2" configured_catalog = ( @@ -663,9 +301,9 @@ def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocke discarded, in this case address and address2 shouldn't be part of the schema in records. """ test_file_base_name = "read_with_empty_column" - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") first_property = "header_1" second_property = "header_2" configured_catalog = ( @@ -710,9 +348,9 @@ def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker It will correctly match row values and field/column names in read records. """ test_file_base_name = "read_duplicated_headers" - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") first_property = "header_1" second_property = "address" third_property = "address2" @@ -774,9 +412,9 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): There are two empty rows between id 16 and 20 that we will not be present in read records """ test_file_base_name = "read_empty_rows" - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - GoogleSheetSourceTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") expected_properties = ["id", "name", "normalized_name"] catalog_properties = {} for property in expected_properties: @@ -817,13 +455,13 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMocker): test_file_base_name = "read_by_batches" batch_size = 10 - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") start_range = 2 for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): end_range = start_range + batch_size request_range = (start_range, end_range) - GoogleSheetSourceTest.get_stream_data( + TestSource.get_stream_data( http_mocker, data_response_file=f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", request_range=request_range ) start_range += batch_size + 1 @@ -842,9 +480,9 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "names_conversion_range") - GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + TestSource.get_sheet_first_row(http_mocker, "names_conversion_range") + TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions") first_expected_converted_property = "_1_test" second_expected_converted_property = "header_2" @@ -890,15 +528,15 @@ def test_when_read_then_return_records_with_name_conversion(self, http_mocker: H @HttpMocker() def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) - GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range_2") - GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) - GoogleSheetSourceTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range_2", stream_name=_C_STREAM_NAME) + TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range_2") + TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) + TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range_2", stream_name=_C_STREAM_NAME) configured_catalog = ( CatalogBuilder() @@ -944,9 +582,9 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker @HttpMocker() def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) + TestSource.get_sheet_first_row(http_mocker, "read_records_range_2", 200) + TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") configured_catalog = ( CatalogBuilder() @@ -967,79 +605,11 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt assert output.trace_messages[1].trace.stream_status.status == AirbyteStreamStatus.RUNNING assert output.trace_messages[2].trace.stream_status.status == AirbyteStreamStatus.COMPLETE - @HttpMocker() - def test_read_429_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "rate_limit_error", status_codes.TOO_MANY_REQUESTS) - - configured_catalog = ( - CatalogBuilder() - .with_stream( - ConfiguredAirbyteStreamBuilder() - .with_name(_STREAM_NAME) - .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) - ) - .build() - ) - - with patch("time.sleep"): - output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - - expected_message = f"Exception while syncing stream {_STREAM_NAME}: " + exception_description_by_status_code( - status_codes.TOO_MANY_REQUESTS, _STREAM_NAME - ) - - assert output.errors[0].trace.error.internal_message == expected_message - - @HttpMocker() - def test_read_403_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) - - configured_catalog = ( - CatalogBuilder() - .with_stream( - ConfiguredAirbyteStreamBuilder() - .with_name(_STREAM_NAME) - .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) - ) - .build() - ) - - output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = ( - exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID) + ". The caller does not have right permissions." - ) - assert output.errors[0].trace.error.message == expected_message - - @HttpMocker() - def test_read_500_error(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range", 200) - GoogleSheetSourceTest.get_stream_data(http_mocker, "internal_server_error", 500) - - configured_catalog = ( - CatalogBuilder() - .with_stream( - ConfiguredAirbyteStreamBuilder() - .with_name(_STREAM_NAME) - .with_json_schema({"properties": {"header_1": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}}) - ) - .build() - ) - - with patch("time.sleep"): - output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - - expected_message = "Exception while syncing stream a_stream_name: There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support" - assert output.errors[0].trace.error.internal_message == expected_message @HttpMocker() def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) configured_catalog = ( CatalogBuilder() @@ -1059,8 +629,8 @@ def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: - GoogleSheetSourceTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - GoogleSheetSourceTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) + TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + TestSource.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) configured_catalog = ( CatalogBuilder() diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_stream.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_stream.py deleted file mode 100644 index 54a2e054d91e4..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_stream.py +++ /dev/null @@ -1,379 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -import logging - -import pytest -import requests -from apiclient import errors -from source_google_sheets import SourceGoogleSheets -from source_google_sheets.client import GoogleSheetsClient -from source_google_sheets.helpers import SCOPES, Helpers -from source_google_sheets.models import CellData, GridData, RowData, Sheet, SheetProperties, Spreadsheet - -from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus, ConfiguredAirbyteCatalog -from airbyte_cdk.utils import AirbyteTracedException - - -def set_http_error_for_google_sheets_client(mocker, resp): - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", side_effect=errors.HttpError(resp=resp, content=b"")) - - -def set_resp_http_error(status_code, error_message=None): - resp = requests.Response() - resp.status = status_code - if error_message: - resp.reason = error_message - return resp - - -def set_sheets_type_grid(sheet_first_row): - data = [GridData(rowData=[RowData(values=[CellData(formattedValue=v) for v in sheet_first_row])])] - sheet = Sheet(properties=SheetProperties(title="sheet1", gridProperties="true", sheetType="GRID"), data=data) - return sheet - - -def test_invalid_credentials_error_message(invalid_config): - source = SourceGoogleSheets() - with pytest.raises(AirbyteTracedException) as e: - source.check(logger=None, config=invalid_config) - assert e.value.args[0] == "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - - -def test_invalid_link_error_message(mocker, invalid_config): - source = SourceGoogleSheets() - set_http_error_for_google_sheets_client(mocker, set_resp_http_error(404)) - with pytest.raises(AirbyteTracedException) as e: - source.check(logger=None, config=invalid_config) - expected_message = "Config error: The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync." - assert e.value.args[0] == expected_message - - -def test_discover_404_error(mocker, invalid_config): - source = SourceGoogleSheets() - set_http_error_for_google_sheets_client(mocker, set_resp_http_error(404, "Requested entity was not found")) - - with pytest.raises(AirbyteTracedException) as e: - source.discover(logger=mocker.MagicMock(), config=invalid_config) - expected_message = ( - "The requested Google Sheets spreadsheet with id invalid_spreadsheet_id does not exist." - " Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support. Requested entity was not found." - ) - assert e.value.args[0] == expected_message - - -def test_discover_403_error(mocker, invalid_config): - source = SourceGoogleSheets() - set_http_error_for_google_sheets_client(mocker, set_resp_http_error(403, "The caller does not have right permissions")) - - with pytest.raises(AirbyteTracedException) as e: - source.discover(logger=mocker.MagicMock(), config=invalid_config) - expected_message = ( - "The authenticated Google Sheets user does not have permissions to view the " - "spreadsheet with id invalid_spreadsheet_id. Please ensure the authenticated user has access" - " to the Spreadsheet and reauthenticate. If the issue persists, contact support. " - "The caller does not have right permissions." - ) - assert e.value.args[0] == expected_message - - -def test_check_invalid_creds_json_file(invalid_config): - source = SourceGoogleSheets() - res = source.check(logger=None, config={""}) - assert "Please use valid credentials json file" in res.message - - -def test_check_access_expired(mocker, invalid_config): - source = SourceGoogleSheets() - set_http_error_for_google_sheets_client(mocker, set_resp_http_error(403)) - expected_message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - with pytest.raises(AirbyteTracedException): - res = source.check(logger=None, config=invalid_config) - assert res.message == expected_message - - -def test_check_expected_to_read_data_from_1_sheet(mocker, invalid_config, caplog): - spreadsheet = Spreadsheet(spreadsheetId="spreadsheet_id", sheets=[set_sheets_type_grid(["1", "2"]), set_sheets_type_grid(["3", "4"])]) - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet) - res = source.check(logger=logging.getLogger("airbyte"), config=invalid_config) - assert str(res.status) == "Status.FAILED" - assert "Unexpected return result: Sheet sheet1 was expected to contain data on exactly 1 sheet." in caplog.text - - -def test_check_duplicated_headers(invalid_config, mocker, caplog): - spreadsheet = Spreadsheet(spreadsheetId="spreadsheet_id", sheets=[set_sheets_type_grid(["1", "1", "3", "4"])]) - source = SourceGoogleSheets() - expected_message = ( - "The following duplicate headers were found in the following sheets. Please fix them to continue: [sheet:sheet1, headers:['1']]" - ) - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet) - res = source.check(logger=logging.getLogger("airbyte"), config=invalid_config) - assert str(res.status) == "Status.FAILED" - assert expected_message in res.message - - -def test_check_status_succeeded(mocker, invalid_config): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object( - GoogleSheetsClient, - "get", - return_value=Spreadsheet( - spreadsheetId="spreadsheet_id", sheets=[Sheet(properties=SheetProperties(title=t)) for t in ["1", "2", "3", "4"]] - ), - ) - - res = source.check(logger=None, config=invalid_config) - assert str(res.status) == "Status.SUCCEEDED" - - -def test_discover_with_non_grid_sheets(mocker, invalid_config): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object( - GoogleSheetsClient, - "get", - return_value=Spreadsheet( - spreadsheetId="spreadsheet_id", sheets=[Sheet(properties=SheetProperties(title=t)) for t in ["1", "2", "3", "4"]] - ), - ) - res = source.discover(logger=mocker.MagicMock(), config=invalid_config) - assert res.streams == [] - - -def test_discover(mocker, invalid_config): - source = SourceGoogleSheets() - spreadsheet = Spreadsheet(spreadsheetId="spreadsheet_id", sheets=[set_sheets_type_grid(["1", "2", "3", "4"])]) - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet) - res = source.discover(logger=mocker.MagicMock(), config=invalid_config) - assert len(res.streams) == 1 - - -def test_discover_with_names_conversion(mocker, invalid_config): - invalid_config["names_conversion"] = True - spreadsheet = Spreadsheet(spreadsheetId="spreadsheet_id", sheets=[set_sheets_type_grid(["1 тест", "2", "3", "4"])]) - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet) - res = source.discover(logger=mocker.MagicMock(), config=invalid_config) - assert len(res.streams) == 1 - assert "_1_test" in res.streams[0].json_schema["properties"].keys() - - -def test_discover_incorrect_spreadsheet_name(mocker, invalid_config): - spreadsheet = Spreadsheet(spreadsheetId="spreadsheet_id", sheets=[set_sheets_type_grid(["1", "2", "3", "4"])]) - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet) - res = source.discover(logger=mocker.MagicMock(), config=invalid_config) - assert len(res.streams) == 1 - - -def test_discover_could_not_run_discover(mocker, invalid_config): - source = SourceGoogleSheets() - set_http_error_for_google_sheets_client(mocker, set_resp_http_error(500, "Interval Server error")) - - with pytest.raises(Exception) as e: - source.discover(logger=mocker.MagicMock(), config=invalid_config) - expected_message = ( - "Could not discover the schema of your spreadsheet. There was an issue with the Google Sheets API." - " This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support. Interval Server error." - ) - assert e.value.args[0] == expected_message - - -def test_discover_invalid_credentials_error_message(mocker, invalid_config): - source = SourceGoogleSheets() - with pytest.raises(AirbyteTracedException) as e: - source.discover(logger=mocker.MagicMock(), config=invalid_config) - assert e.value.args[0] == "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - - -def test_get_credentials(invalid_config): - expected_config = { - "auth_type": "Client", - "client_id": "fake_client_id", - "client_secret": "fake_client_secret", - "refresh_token": "fake_refresh_token", - } - assert expected_config == SourceGoogleSheets.get_credentials(invalid_config) - - -def test_get_credentials_old_style(): - old_style_config = {"credentials_json": "some old style data"} - expected_config = {"auth_type": "Service", "service_account_info": "some old style data"} - assert expected_config == SourceGoogleSheets.get_credentials(old_style_config) - - -def test_read_429_error(mocker, invalid_config, catalog, caplog): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=mocker.Mock) - mocker.patch.object( - Helpers, - "get_sheets_in_spreadsheet", - side_effect=errors.HttpError(resp=set_resp_http_error(429, "Request a higher quota limit"), content=b""), - ) - - sheet1 = "soccer_team" - sheet1_columns = frozenset(["arsenal", "chelsea", "manutd", "liverpool"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - catalog = ConfiguredAirbyteCatalog( - streams=catalog( - (sheet1, sheet1_schema), - ) - ) - with pytest.raises(AirbyteTracedException) as e: - next(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - expected_message = "Rate limit has been reached. Please try later or request a higher quota for your account." - assert e.value.args[0] == expected_message - - -def test_read_403_error(mocker, invalid_config, catalog, caplog): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=mocker.Mock) - mocker.patch.object( - Helpers, "get_sheets_in_spreadsheet", side_effect=errors.HttpError(resp=set_resp_http_error(403, "Permission denied"), content=b"") - ) - - sheet1 = "soccer_team" - sheet1_columns = frozenset(["arsenal", "chelsea", "manutd", "liverpool"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - catalog = ConfiguredAirbyteCatalog( - streams=catalog( - (sheet1, sheet1_schema), - ) - ) - with pytest.raises(AirbyteTracedException) as e: - next(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - assert ( - str(e.value) - == "The authenticated Google Sheets user does not have permissions to view the spreadsheet with id invalid_spreadsheet_id. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support" - ) - - -def test_read_500_error(mocker, invalid_config, catalog, caplog): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - mocker.patch.object(GoogleSheetsClient, "get", return_value=mocker.Mock) - mocker.patch.object( - Helpers, - "get_sheets_in_spreadsheet", - side_effect=errors.HttpError(resp=set_resp_http_error(500, "Internal error encountered."), content=b""), - ) - - sheet1 = "soccer_team" - sheet1_columns = frozenset(["arsenal", "chelsea", "manutd", "liverpool"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - catalog = ConfiguredAirbyteCatalog( - streams=catalog( - (sheet1, sheet1_schema), - ) - ) - with pytest.raises(AirbyteTracedException) as e: - next(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - expected_message = ( - "There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side." - " Please try again. If this issue persists, contact support" - ) - assert e.value.args[0] == expected_message - - -def test_read_expected_data_on_1_sheet(invalid_config, mocker, catalog, caplog): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - sheet1 = "soccer_team" - sheet2 = "soccer_team2" - mocker.patch.object( - GoogleSheetsClient, - "get", - return_value=Spreadsheet( - spreadsheetId="spreadsheet_id", sheets=[Sheet(properties=SheetProperties(title=t)) for t in [sheet1, sheet2]] - ), - ) - - sheet1_columns = frozenset(["arsenal", "chelsea", "manutd", "liverpool"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - catalog = ConfiguredAirbyteCatalog(streams=catalog((sheet1, sheet1_schema), (sheet2, sheet1_schema))) - - with pytest.raises(Exception) as e: - next(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - assert "Unexpected return result: Sheet soccer_team was expected to contain data on exactly 1 sheet." in str(e.value) - - -def test_read_empty_sheet(invalid_config, mocker, catalog, caplog): - source = SourceGoogleSheets() - mocker.patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes=SCOPES: None) - sheet1 = "soccer_team" - sheet2 = "soccer_team2" - sheets = [ - Sheet( - properties=SheetProperties(title=t), - data=[ - {"test1": "12", "test2": "123"}, - ], - ) - for t in [sheet1] - ] - mocker.patch.object( - GoogleSheetsClient, - "get", - return_value=Spreadsheet(spreadsheetId=invalid_config["spreadsheet_id"], sheets=sheets), - ) - - sheet1_columns = frozenset(["arsenal", "chelsea"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - catalog = ConfiguredAirbyteCatalog(streams=catalog((sheet1, sheet1_schema), (sheet2, sheet1_schema))) - records = list(source.read(logger=logging.getLogger("airbyte"), catalog=catalog, config=invalid_config)) - assert records == [] - assert "The sheet soccer_team (ID invalid_spreadsheet_id) is empty!" in caplog.text - - -def test_when_read_then_status_messages_emitted(mocker, spreadsheet, spreadsheet_values, catalog, invalid_config): - source = SourceGoogleSheets() - spreadsheet_id = "invalid_spreadsheet_id" - sheet_name = "sheet_1" - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet(spreadsheet_id, sheet_name)) - mocker.patch.object(GoogleSheetsClient, "get_values", return_value=spreadsheet_values(spreadsheet_id)) - - sheet_schema = {"properties": {"ID": {"type": "string"}}} - catalog = ConfiguredAirbyteCatalog( - streams=catalog( - (sheet_name, sheet_schema), - ) - ) - records = list(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - - # stream started, stream running, 1 record, stream state, stream completed - assert len(records) == 5 - assert records[0].trace.stream_status.status == AirbyteStreamStatus.STARTED - assert records[1].trace.stream_status.status == AirbyteStreamStatus.RUNNING - assert records[4].trace.stream_status.status == AirbyteStreamStatus.COMPLETE - - -def test_when_read_then_state_message_emitted(mocker, spreadsheet, spreadsheet_values, catalog, invalid_config): - source = SourceGoogleSheets() - spreadsheet_id = "invalid_spreadsheet_id" - sheet_name = "sheet_1" - mocker.patch.object(GoogleSheetsClient, "get", return_value=spreadsheet(spreadsheet_id, sheet_name)) - mocker.patch.object(GoogleSheetsClient, "get_values", return_value=spreadsheet_values(spreadsheet_id)) - - sheet_schema = {"properties": {"ID": {"type": "string"}}} - catalog = ConfiguredAirbyteCatalog( - streams=catalog( - (sheet_name, sheet_schema), - ) - ) - records = list(source.read(logger=logging.getLogger("airbyte"), config=invalid_config, catalog=catalog)) - - # stream started, stream running, 1 record, stream state, stream completed - assert len(records) == 5 - assert records[3].state.stream.stream_state == AirbyteStateBlob(__ab_no_cursor_state_message=True) - assert records[3].state.stream.stream_descriptor.name == "sheet_1" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py index dde2391f7172b..97e79d780db8a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py @@ -25,24 +25,3 @@ def test_safe_name_conversion(): safe_name_conversion("*****") assert exc_info.value.args[0] == "initial string '*****' converted to empty" - -@pytest.mark.parametrize( - "status_code, expected_message", - [ - ( - 404, - "The requested Google Sheets spreadsheet with id spreadsheet_id does not exist. Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support", - ), - (429, "Rate limit has been reached. Please try later or request a higher quota for your account."), - ( - 500, - "There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support", - ), - ( - 403, - "The authenticated Google Sheets user does not have permissions to view the spreadsheet with id spreadsheet_id. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support", - ), - ], -) -def test_exception_description_by_status_code(status_code, expected_message): - assert expected_message == exception_description_by_status_code(status_code, "spreadsheet_id") From 5dd67d08db1544be3480d80db63bafcdba914d3f Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 1 Jan 2025 17:54:55 -0600 Subject: [PATCH 18/63] source-google-sheets: ruff-format --- .../integration/google_sheets_base_test.py | 3 ++- .../unit_tests/integration/mock_credentials.py | 2 +- .../unit_tests/integration/protocol_helpers.py | 8 ++------ .../integration/test_auth_credentials.py | 7 ++----- .../integration/test_exception_description.py | 15 ++++++++------- .../unit_tests/integration/test_source.py | 6 ++---- .../source-google-sheets/unit_tests/test_utils.py | 1 - 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index a69990a2708f1..a1d3c345e87f3 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -14,9 +14,10 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from .request_builder import AuthBuilder, RequestBuilder from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials from .protocol_helpers import check_helper, discover_helper, read_helper +from .request_builder import AuthBuilder, RequestBuilder + _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py index a55e57c1f9a9e..b7741e7ea0e2b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py @@ -35,7 +35,7 @@ """ -AUTH_BODY = 'grant_type=refresh_token&client_id=43987534895734985.apps.googleusercontent.com&client_secret=2347586435987643598&refresh_token=1%2F%2F4398574389537495437983457985437' +AUTH_BODY = "grant_type=refresh_token&client_id=43987534895734985.apps.googleusercontent.com&client_secret=2347586435987643598&refresh_token=1%2F%2F4398574389537495437983457985437" service_account_info = { "type": "service_account", diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py index f9b816e8e0c40..ed8c22f3a31ab 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py @@ -2,20 +2,16 @@ from typing import Any, Dict, Optional, Tuple + from source_google_sheets import SourceGoogleSheets -from airbyte_cdk.models import ( - ConfiguredAirbyteCatalog, - SyncMode -) +from airbyte_cdk.models import ConfiguredAirbyteCatalog, SyncMode from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read - from .entrypoint_wrapper_helper import check - def _catalog(sync_mode: SyncMode, stream_name: str) -> ConfiguredAirbyteCatalog: return CatalogBuilder().with_stream(stream_name, sync_mode).build() diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index 20d90e3bd5a3b..64ae808d50f2d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -17,13 +17,13 @@ TraceType, Type, ) - from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template from .google_sheets_base_test import GoogleSheetsBaseTest -from .request_builder import AuthBuilder, RequestBuilder from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info +from .request_builder import AuthBuilder, RequestBuilder + _SPREADSHEET_ID = "a_spreadsheet_id" @@ -42,7 +42,6 @@ class TestCredentials(GoogleSheetsBaseTest): - def test_given_authentication_error_when_check_then_status_is_failed(self) -> None: del self._config["credentials"]["client_secret"] @@ -89,8 +88,6 @@ def test_invalid_credentials_error_message_when_check(self, http_mocker: HttpMoc expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) assert output.errors[-1] == expected_message - - def test_check_invalid_creds_json_file(self) -> None: invalid_creds_json_file = {} output = self._check(invalid_creds_json_file, expecting_exception=True) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 3a2d4286831cc..5e789756c7026 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -18,10 +18,12 @@ from .google_sheets_base_test import GoogleSheetsBaseTest + _SPREADSHEET_ID = "a_spreadsheet_id" _STREAM_NAME = "a_stream_name" + def exception_description_by_status_code(code: int, spreadsheet_id) -> str: if code in [status_codes.INTERNAL_SERVER_ERROR, status_codes.BAD_GATEWAY, status_codes.SERVICE_UNAVAILABLE]: return ( @@ -44,6 +46,7 @@ def exception_description_by_status_code(code: int, spreadsheet_id) -> str: return "" + class TestExceptionDescriptionByStatusCode(GoogleSheetsBaseTest): @HttpMocker() def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> None: @@ -67,7 +70,7 @@ def test_invalid_link_error_message_when_check(self, http_mocker: HttpMocker) -> def test_check_access_expired(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) expected_message = ( - f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." ) output = self._check(self._config, expecting_exception=True) @@ -104,7 +107,7 @@ def test_discover_could_not_run_discover(self, http_mocker: HttpMocker) -> None: ) expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) assert output.errors[-1] == expected_message - + @HttpMocker() def test_discover_404_error(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_link", status_codes.NOT_FOUND) @@ -122,14 +125,14 @@ def test_discover_404_error(self, http_mocker: HttpMocker) -> None: ) expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) assert output.errors[-1] == expected_message - + @HttpMocker() def test_discover_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "invalid_permissions", status_codes.FORBIDDEN) output = self._discover(self._config, expecting_exception=True) expected_message = ( - f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." ) trace_message = AirbyteTraceMessage( @@ -168,7 +171,6 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: assert output.errors[0].trace.error.internal_message == expected_message - @HttpMocker() def test_read_403_error(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) @@ -187,11 +189,10 @@ def test_read_403_error(self, http_mocker: HttpMocker) -> None: output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) expected_message = ( - f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." + f"{exception_description_by_status_code(status_codes.FORBIDDEN, _SPREADSHEET_ID)}. The caller does not have right permissions." ) assert output.errors[0].trace.error.message == expected_message - @HttpMocker() def test_read_500_error(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index b422f298d93a6..5075e95959754 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -37,9 +37,10 @@ from airbyte_cdk.test.mock_http.response_builder import find_template from .google_sheets_base_test import GoogleSheetsBaseTest -from .request_builder import AuthBuilder, RequestBuilder from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info from .protocol_helpers import check_helper, discover_helper, read_helper +from .request_builder import AuthBuilder, RequestBuilder + _SPREADSHEET_ID = "a_spreadsheet_id" @@ -58,7 +59,6 @@ class TestSource(GoogleSheetsBaseTest): - @HttpMocker() def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker: HttpMocker) -> None: TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") @@ -68,7 +68,6 @@ def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) assert output.logs[-1] == expected_message - @HttpMocker() def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) @@ -605,7 +604,6 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt assert output.trace_messages[1].trace.stream_status.status == AirbyteStreamStatus.RUNNING assert output.trace_messages[2].trace.stream_status.status == AirbyteStreamStatus.COMPLETE - @HttpMocker() def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py index 97e79d780db8a..0fe1e6a3a1966 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py @@ -24,4 +24,3 @@ def test_safe_name_conversion(): with pytest.raises(Exception) as exc_info: safe_name_conversion("*****") assert exc_info.value.args[0] == "initial string '*****' converted to empty" - From 60212533f9fc0218432130c18d881004c499c838 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 1 Jan 2025 18:02:41 -0600 Subject: [PATCH 19/63] source-google-sheets: update release information --- .../source-google-sheets/metadata.yaml | 2 +- .../source-google-sheets/poetry.lock | 810 +++++++++--------- .../source-google-sheets/pyproject.toml | 4 +- docs/integrations/sources/google-sheets.md | 1 + 4 files changed, 403 insertions(+), 414 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index f132cad60d21f..dec26d60032c9 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -10,7 +10,7 @@ data: connectorSubtype: file connectorType: source definitionId: 71607ba1-c0ac-4799-8049-7f4b90dd50f7 - dockerImageTag: 0.8.4 + dockerImageTag: 0.9.4 dockerRepository: airbyte/source-google-sheets documentationUrl: https://docs.airbyte.com/integrations/sources/google-sheets githubIssueLabel: source-google-sheets diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index 86bfb4366d59f..018ffc55a1a24 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.11.1.dev4100" +version = "6.12.4" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.11.1.dev4100-py3-none-any.whl", hash = "sha256:d24d229a98c9cc9075173a6a7e85baeaeaadad9012f25108edffcfaeb0cad642"}, - {file = "airbyte_cdk-6.11.1.dev4100.tar.gz", hash = "sha256:eafd439909e47178c7b3b967dcb589bb7de35392dccf303ab8133d6047054f58"}, + {file = "airbyte_cdk-6.12.4-py3-none-any.whl", hash = "sha256:903f2c2d3be4d6595bc6c50a4625e2551308d2ca90e021bf489e0a82cf0f965d"}, + {file = "airbyte_cdk-6.12.4.tar.gz", hash = "sha256:f9f39746dec5e01a9d37255cfb45a753953227b7aafebf8f5603a6e9f943b182"}, ] [package.dependencies] @@ -35,12 +35,13 @@ pyjwt = ">=2.8.0,<3.0.0" pyrate-limiter = ">=3.1.0,<3.2.0" python-dateutil = "*" python-ulid = ">=3.0.0,<4.0.0" -pytz = "2024.1" +pytz = "2024.2" PyYAML = ">=6.0.1,<7.0.0" rapidfuzz = ">=3.10.1,<4.0.0" requests = "*" requests_cache = "*" serpyco-rs = ">=1.10.2,<2.0.0" +Unidecode = ">=1.3,<2.0" wcmatch = "10.0" xmltodict = ">=0.13.0,<0.14.0" @@ -284,127 +285,114 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -729,13 +717,13 @@ six = "*" [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -998,86 +986,86 @@ files = [ [[package]] name = "orjson" -version = "3.10.12" +version = "3.10.13" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, - {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, - {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, - {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, - {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, - {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, - {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, - {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, - {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, - {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, - {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, - {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, - {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, - {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, - {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, - {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, - {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, - {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, - {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, - {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, - {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, + {file = "orjson-3.10.13-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1232c5e873a4d1638ef957c5564b4b0d6f2a6ab9e207a9b3de9de05a09d1d920"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26a0eca3035619fa366cbaf49af704c7cb1d4a0e6c79eced9f6a3f2437964b6"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4b6acd7c9c829895e50d385a357d4b8c3fafc19c5989da2bae11783b0fd4977"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1884e53c6818686891cc6fc5a3a2540f2f35e8c76eac8dc3b40480fb59660b00"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a428afb5720f12892f64920acd2eeb4d996595bf168a26dd9190115dbf1130d"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba5b13b8739ce5b630c65cb1c85aedbd257bcc2b9c256b06ab2605209af75a2e"}, + {file = "orjson-3.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cab83e67f6aabda1b45882254b2598b48b80ecc112968fc6483fa6dae609e9f0"}, + {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:62c3cc00c7e776c71c6b7b9c48c5d2701d4c04e7d1d7cdee3572998ee6dc57cc"}, + {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dc03db4922e75bbc870b03fc49734cefbd50fe975e0878327d200022210b82d8"}, + {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22f1c9a30b43d14a041a6ea190d9eca8a6b80c4beb0e8b67602c82d30d6eec3e"}, + {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b42f56821c29e697c68d7d421410d7c1d8f064ae288b525af6a50cf99a4b1200"}, + {file = "orjson-3.10.13-cp310-cp310-win32.whl", hash = "sha256:0dbf3b97e52e093d7c3e93eb5eb5b31dc7535b33c2ad56872c83f0160f943487"}, + {file = "orjson-3.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:46c249b4e934453be4ff2e518cd1adcd90467da7391c7a79eaf2fbb79c51e8c7"}, + {file = "orjson-3.10.13-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a36c0d48d2f084c800763473020a12976996f1109e2fcb66cfea442fdf88047f"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0065896f85d9497990731dfd4a9991a45b0a524baec42ef0a63c34630ee26fd6"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92b4ec30d6025a9dcdfe0df77063cbce238c08d0404471ed7a79f309364a3d19"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a94542d12271c30044dadad1125ee060e7a2048b6c7034e432e116077e1d13d2"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3723e137772639af8adb68230f2aa4bcb27c48b3335b1b1e2d49328fed5e244c"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f00c7fb18843bad2ac42dc1ce6dd214a083c53f1e324a0fd1c8137c6436269b"}, + {file = "orjson-3.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0e2759d3172300b2f892dee85500b22fca5ac49e0c42cfff101aaf9c12ac9617"}, + {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee948c6c01f6b337589c88f8e0bb11e78d32a15848b8b53d3f3b6fea48842c12"}, + {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa6fe68f0981fba0d4bf9cdc666d297a7cdba0f1b380dcd075a9a3dd5649a69e"}, + {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbcd7aad6bcff258f6896abfbc177d54d9b18149c4c561114f47ebfe74ae6bfd"}, + {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2149e2fcd084c3fd584881c7f9d7f9e5ad1e2e006609d8b80649655e0d52cd02"}, + {file = "orjson-3.10.13-cp311-cp311-win32.whl", hash = "sha256:89367767ed27b33c25c026696507c76e3d01958406f51d3a2239fe9e91959df2"}, + {file = "orjson-3.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:dca1d20f1af0daff511f6e26a27354a424f0b5cf00e04280279316df0f604a6f"}, + {file = "orjson-3.10.13-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a3614b00621c77f3f6487792238f9ed1dd8a42f2ec0e6540ee34c2d4e6db813a"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c976bad3996aa027cd3aef78aa57873f3c959b6c38719de9724b71bdc7bd14b"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f74d878d1efb97a930b8a9f9898890067707d683eb5c7e20730030ecb3fb930"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33ef84f7e9513fb13b3999c2a64b9ca9c8143f3da9722fbf9c9ce51ce0d8076e"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd2bcde107221bb9c2fa0c4aaba735a537225104173d7e19cf73f70b3126c993"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064b9dbb0217fd64a8d016a8929f2fae6f3312d55ab3036b00b1d17399ab2f3e"}, + {file = "orjson-3.10.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0044b0b8c85a565e7c3ce0a72acc5d35cda60793edf871ed94711e712cb637d"}, + {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7184f608ad563032e398f311910bc536e62b9fbdca2041be889afcbc39500de8"}, + {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d36f689e7e1b9b6fb39dbdebc16a6f07cbe994d3644fb1c22953020fc575935f"}, + {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:54433e421618cd5873e51c0e9d0b9fb35f7bf76eb31c8eab20b3595bb713cd3d"}, + {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e1ba0c5857dd743438acecc1cd0e1adf83f0a81fee558e32b2b36f89e40cee8b"}, + {file = "orjson-3.10.13-cp312-cp312-win32.whl", hash = "sha256:a42b9fe4b0114b51eb5cdf9887d8c94447bc59df6dbb9c5884434eab947888d8"}, + {file = "orjson-3.10.13-cp312-cp312-win_amd64.whl", hash = "sha256:3a7df63076435f39ec024bdfeb4c9767ebe7b49abc4949068d61cf4857fa6d6c"}, + {file = "orjson-3.10.13-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2cdaf8b028a976ebab837a2c27b82810f7fc76ed9fb243755ba650cc83d07730"}, + {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a946796e390cbb803e069472de37f192b7a80f4ac82e16d6eb9909d9e39d56"}, + {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d64f1db5ecbc21eb83097e5236d6ab7e86092c1cd4c216c02533332951afc"}, + {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:711878da48f89df194edd2ba603ad42e7afed74abcd2bac164685e7ec15f96de"}, + {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cf16f06cb77ce8baf844bc222dbcb03838f61d0abda2c3341400c2b7604e436e"}, + {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8257c3fb8dd7b0b446b5e87bf85a28e4071ac50f8c04b6ce2d38cb4abd7dff57"}, + {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9c3a87abe6f849a4a7ac8a8a1dede6320a4303d5304006b90da7a3cd2b70d2c"}, + {file = "orjson-3.10.13-cp313-cp313-win32.whl", hash = "sha256:527afb6ddb0fa3fe02f5d9fba4920d9d95da58917826a9be93e0242da8abe94a"}, + {file = "orjson-3.10.13-cp313-cp313-win_amd64.whl", hash = "sha256:b5f7c298d4b935b222f52d6c7f2ba5eafb59d690d9a3840b7b5c5cda97f6ec5c"}, + {file = "orjson-3.10.13-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e49333d1038bc03a25fdfe11c86360df9b890354bfe04215f1f54d030f33c342"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:003721c72930dbb973f25c5d8e68d0f023d6ed138b14830cc94e57c6805a2eab"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63664bf12addb318dc8f032160e0f5dc17eb8471c93601e8f5e0d07f95003784"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6066729cf9552d70de297b56556d14b4f49c8f638803ee3c90fd212fa43cc6af"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a1152e2761025c5d13b5e1908d4b1c57f3797ba662e485ae6f26e4e0c466388"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b21d91c5c5ef8a201036d207b1adf3aa596b930b6ca3c71484dd11386cf6c3"}, + {file = "orjson-3.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b12a63f48bb53dba8453d36ca2661f2330126d54e26c1661e550b32864b28ce3"}, + {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a5a7624ab4d121c7e035708c8dd1f99c15ff155b69a1c0affc4d9d8b551281ba"}, + {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0fee076134398d4e6cb827002468679ad402b22269510cf228301b787fdff5ae"}, + {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ae537fcf330b3947e82c6ae4271e092e6cf16b9bc2cef68b14ffd0df1fa8832a"}, + {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f81b26c03f5fb5f0d0ee48d83cea4d7bc5e67e420d209cc1a990f5d1c62f9be0"}, + {file = "orjson-3.10.13-cp38-cp38-win32.whl", hash = "sha256:0bc858086088b39dc622bc8219e73d3f246fb2bce70a6104abd04b3a080a66a8"}, + {file = "orjson-3.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:3ca6f17467ebbd763f8862f1d89384a5051b461bb0e41074f583a0ebd7120e8e"}, + {file = "orjson-3.10.13-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a11532cbfc2f5752c37e84863ef8435b68b0e6d459b329933294f65fa4bda1a"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c96d2fb80467d1d0dfc4d037b4e1c0f84f1fe6229aa7fea3f070083acef7f3d7"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dda4ba4d3e6f6c53b6b9c35266788053b61656a716a7fef5c884629c2a52e7aa"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f998bbf300690be881772ee9c5281eb9c0044e295bcd4722504f5b5c6092ff"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1cc42ed75b585c0c4dc5eb53a90a34ccb493c09a10750d1a1f9b9eff2bd12"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b0f29d485411e3c13d79604b740b14e4e5fb58811743f6f4f9693ee6480a8f"}, + {file = "orjson-3.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:233aae4474078d82f425134bb6a10fb2b3fc5a1a1b3420c6463ddd1b6a97eda8"}, + {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e384e330a67cf52b3597ee2646de63407da6f8fc9e9beec3eaaaef5514c7a1c9"}, + {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4222881d0aab76224d7b003a8e5fdae4082e32c86768e0e8652de8afd6c4e2c1"}, + {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e400436950ba42110a20c50c80dff4946c8e3ec09abc1c9cf5473467e83fd1c5"}, + {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f47c9e7d224b86ffb086059cdcf634f4b3f32480f9838864aa09022fe2617ce2"}, + {file = "orjson-3.10.13-cp39-cp39-win32.whl", hash = "sha256:a9ecea472f3eb653e1c0a3d68085f031f18fc501ea392b98dcca3e87c24f9ebe"}, + {file = "orjson-3.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:5385935a73adce85cc7faac9d396683fd813566d3857fa95a0b521ef84a5b588"}, + {file = "orjson-3.10.13.tar.gz", hash = "sha256:eb9bfb14ab8f68d9d9492d4817ae497788a15fd7da72e14dfabc289c3bb088ec"}, ] [[package]] @@ -1248,22 +1236,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.29.1" +version = "5.29.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.29.1-cp310-abi3-win32.whl", hash = "sha256:22c1f539024241ee545cbcb00ee160ad1877975690b16656ff87dde107b5f110"}, - {file = "protobuf-5.29.1-cp310-abi3-win_amd64.whl", hash = "sha256:1fc55267f086dd4050d18ef839d7bd69300d0d08c2a53ca7df3920cc271a3c34"}, - {file = "protobuf-5.29.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d473655e29c0c4bbf8b69e9a8fb54645bc289dead6d753b952e7aa660254ae18"}, - {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5ba1d0e4c8a40ae0496d0e2ecfdbb82e1776928a205106d14ad6985a09ec155"}, - {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ee1461b3af56145aca2800e6a3e2f928108c749ba8feccc6f5dd0062c410c0d"}, - {file = "protobuf-5.29.1-cp38-cp38-win32.whl", hash = "sha256:50879eb0eb1246e3a5eabbbe566b44b10348939b7cc1b267567e8c3d07213853"}, - {file = "protobuf-5.29.1-cp38-cp38-win_amd64.whl", hash = "sha256:027fbcc48cea65a6b17028510fdd054147057fa78f4772eb547b9274e5219331"}, - {file = "protobuf-5.29.1-cp39-cp39-win32.whl", hash = "sha256:5a41deccfa5e745cef5c65a560c76ec0ed8e70908a67cc8f4da5fce588b50d57"}, - {file = "protobuf-5.29.1-cp39-cp39-win_amd64.whl", hash = "sha256:012ce28d862ff417fd629285aca5d9772807f15ceb1a0dbd15b88f58c776c98c"}, - {file = "protobuf-5.29.1-py3-none-any.whl", hash = "sha256:32600ddb9c2a53dedc25b8581ea0f1fd8ea04956373c0c07577ce58d312522e0"}, - {file = "protobuf-5.29.1.tar.gz", hash = "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb"}, + {file = "protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851"}, + {file = "protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9"}, + {file = "protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e"}, + {file = "protobuf-5.29.2-cp38-cp38-win32.whl", hash = "sha256:e621a98c0201a7c8afe89d9646859859be97cb22b8bf1d8eacfd90d5bda2eb19"}, + {file = "protobuf-5.29.2-cp38-cp38-win_amd64.whl", hash = "sha256:13d6d617a2a9e0e82a88113d7191a1baa1e42c2cc6f5f1398d3b054c8e7e714a"}, + {file = "protobuf-5.29.2-cp39-cp39-win32.whl", hash = "sha256:36000f97ea1e76e8398a3f02936aac2a5d2b111aae9920ec1b769fc4a222c4d9"}, + {file = "protobuf-5.29.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d2e674c58a06311c8e99e74be43e7f3a8d1e2b2fdf845eaa347fbd866f23355"}, + {file = "protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181"}, + {file = "protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e"}, ] [[package]] @@ -1345,18 +1333,18 @@ files = [ [[package]] name = "pydantic" -version = "2.10.3" +version = "2.10.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, - {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, + {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, + {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.1" +pydantic-core = "2.27.2" typing-extensions = ">=4.12.2" [package.extras] @@ -1365,111 +1353,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.27.1" +version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, - {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, - {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, - {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, - {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, - {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, - {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, - {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, - {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, - {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, - {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, - {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, - {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, - {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, - {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, - {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, - {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] [package.dependencies] @@ -1494,13 +1482,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyparsing" -version = "3.2.0" +version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" files = [ - {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, - {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, ] [package.extras] @@ -1633,13 +1621,13 @@ pydantic = ["pydantic (>=2.0)"] [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -1717,99 +1705,99 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.10.1" +version = "3.11.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.9" files = [ - {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:779027d3307e1a2b1dc0c03c34df87a470a368a1a0840a9d2908baf2d4067956"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:440b5608ab12650d0390128d6858bc839ae77ffe5edf0b33a1551f2fa9860651"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cac41a411e07a6f3dc80dfbd33f6be70ea0abd72e99c59310819d09f07d945"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:958473c9f0bca250590200fd520b75be0dbdbc4a7327dc87a55b6d7dc8d68552"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef60dfa73749ef91cb6073be1a3e135f4846ec809cc115f3cbfc6fe283a5584"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fbac18f2c19fc983838a60611e67e3262e36859994c26f2ee85bb268de2355"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a0d519ff39db887cd73f4e297922786d548f5c05d6b51f4e6754f452a7f4296"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bebb7bc6aeb91cc57e4881b222484c26759ca865794187217c9dcea6c33adae6"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe07f8b9c3bb5c5ad1d2c66884253e03800f4189a60eb6acd6119ebaf3eb9894"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfa48a4a2d45a41457f0840c48e579db157a927f4e97acf6e20df8fc521c79de"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cf44d01bfe8ee605b7eaeecbc2b9ca64fc55765f17b304b40ed8995f69d7716"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e6bbca9246d9eedaa1c84e04a7f555493ba324d52ae4d9f3d9ddd1b740dcd87"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win32.whl", hash = "sha256:567f88180f2c1423b4fe3f3ad6e6310fc97b85bdba574801548597287fc07028"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6b2cd7c29d6ecdf0b780deb587198f13213ac01c430ada6913452fd0c40190fc"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win_arm64.whl", hash = "sha256:9f912d459e46607ce276128f52bea21ebc3e9a5ccf4cccfef30dd5bddcf47be8"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac7adee6bcf0c6fee495d877edad1540a7e0f5fc208da03ccb64734b43522d7a"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:425f4ac80b22153d391ee3f94bc854668a0c6c129f05cf2eaf5ee74474ddb69e"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65a2fa13e8a219f9b5dcb9e74abe3ced5838a7327e629f426d333dfc8c5a6e66"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75561f3df9a906aaa23787e9992b228b1ab69007932dc42070f747103e177ba8"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd062490537e97ca125bc6c7f2b7331c2b73d21dc304615afe61ad1691e15d5"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfcc8feccf63245a22dfdd16e222f1a39771a44b870beb748117a0e09cbb4a62"}, - {file = "rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win32.whl", hash = "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win32.whl", hash = "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win32.whl", hash = "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win32.whl", hash = "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win32.whl", hash = "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424"}, + {file = "rapidfuzz-3.11.0.tar.gz", hash = "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f"}, ] [package.extras] @@ -2197,13 +2185,13 @@ six = "*" [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -2240,4 +2228,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "f0888b5c419ee7828d8ee6c9190eab2a93ff2b7f3188ecca18cd851868767404" +content-hash = "16075e8c6000f5472a79d477d6fb7e7c5026a729e69026f045665175e35b92ee" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index fb0dd65972294..0d9d181df59fa 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "0.8.4" +version = "0.9.4" name = "source-google-sheets" description = "Source implementation for Google Sheets." authors = [ "Airbyte ",] @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = "6.11.1.dev04100" +airbyte-cdk = "^6" google-auth-httplib2 = "==0.2.0" Unidecode = "==1.3.8" google-api-python-client = "==2.114.0" diff --git a/docs/integrations/sources/google-sheets.md b/docs/integrations/sources/google-sheets.md index d8d3751707d8a..a625dbdfdce8d 100644 --- a/docs/integrations/sources/google-sheets.md +++ b/docs/integrations/sources/google-sheets.md @@ -189,6 +189,7 @@ Airbyte batches requests to the API in order to efficiently pull data and respec | Version | Date | Pull Request | Subject | |---------|------------|----------------------------------------------------------|-----------------------------------------------------------------------------------| +| 0.9.4 | 2025-01-06 | [50843](https://github.com/airbytehq/airbyte/pull/50843) | Migrate low code | | 0.8.4 | 2024-12-09 | [48835](https://github.com/airbytehq/airbyte/pull/48835) | Implementing integration tests | | 0.7.4 | 2024-09-09 | [45108](https://github.com/airbytehq/airbyte/pull/45108) | Google Sheets API errors now cause syncs to fail | | 0.7.3 | 2024-08-12 | [43921](https://github.com/airbytehq/airbyte/pull/43921) | Update dependencies | From 5876dc937453f48b731fc522f81fa83e753baf3c Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Thu, 2 Jan 2025 00:07:20 +0000 Subject: [PATCH 20/63] chore: auto-fix lint and format issues --- .../source_google_sheets/components/extractors.py | 1 + .../source-google-sheets/source_google_sheets/run.py | 3 ++- .../source-google-sheets/source_google_sheets/source_.py | 8 +++++--- .../unit_tests/integration/entrypoint_wrapper_helper.py | 4 +--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index f281dec79f293..aab3f1d10f746 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -6,6 +6,7 @@ import dpath import requests + from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString from airbyte_cdk.sources.types import Config diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index 3b7a158fb21e0..e9c999590f9d6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -8,9 +8,10 @@ from datetime import datetime from typing import List +from orjson import orjson + from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type -from orjson import orjson from source_google_sheets.source import SourceGoogleSheets diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py index eae6e37761231..06ba0e617d123 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py @@ -8,6 +8,10 @@ import socket from typing import Any, Generator, List, Mapping, MutableMapping, Optional, Union +from apiclient import errors +from google.auth import exceptions as google_exceptions +from requests.status_codes import codes as status_codes + from airbyte_cdk.models import FailureType from airbyte_cdk.models.airbyte_protocol import ( AirbyteCatalog, @@ -24,9 +28,6 @@ from airbyte_cdk.sources.streams.checkpoint import FullRefreshCheckpointReader from airbyte_cdk.utils import AirbyteTracedException from airbyte_cdk.utils.stream_status_utils import as_airbyte_message -from apiclient import errors -from google.auth import exceptions as google_exceptions -from requests.status_codes import codes as status_codes from .client import GoogleSheetsClient from .helpers import Helpers @@ -34,6 +35,7 @@ from .models.spreadsheet_values import SpreadsheetValues from .utils import exception_description_by_status_code, safe_name_conversion + # override default socket timeout to be 10 mins instead of 60 sec. # on behalf of https://github.com/airbytehq/oncall/issues/242 DEFAULT_SOCKET_TIMEOUT: int = 600 diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py index b9d93dee53e00..3b06353ac62ae 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py @@ -23,6 +23,4 @@ def check( tmp_directory_path = Path(tmp_directory) config_file = make_file(tmp_directory_path / "config.json", config) - return _run_command( - source, ["check", "--config", config_file, "--debug"], expecting_exception - ) + return _run_command(source, ["check", "--config", config_file, "--debug"], expecting_exception) From 874c191c98a3f369a565ed61fb13bc8cb0b331f2 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 2 Jan 2025 19:19:15 -0600 Subject: [PATCH 21/63] source-google-sheets: add tests for components and urls --- .../components/extractors.py | 19 +- .../integration/google_sheets_base_test.py | 10 +- .../integration/protocol_helpers.py | 6 +- .../unit_tests/integration/test_source.py | 228 ++++++++++++++---- .../unit_tests/test_components.py | 172 +++++++++++++ 5 files changed, 369 insertions(+), 66 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index aab3f1d10f746..86e0d26f12509 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -54,9 +54,12 @@ def parse_raw_schema_values( names_conversion: bool, ): """ - Parses sheet headers from the provided row. This method assumes that data is contiguous - i.e: every cell contains a value and the first cell which does not contain a value denotes the end - of the headers. + 1. Parses sheet headers from the provided raw schema. This method assumes that data is contiguous + i.e: every cell contains a value and the first cell which does not contain a value denotes the end + of the headers. + 2. Makes name conversion if required. + 3. Removes duplicated fields from the schema. + Return a list of tuples with correct property index (by found in array), value and raw_schema """ raw_schema_properties = self._extract_data(raw_schema_data, schema_pointer) duplicate_fields = set() @@ -82,6 +85,7 @@ def parse_raw_schema_values( return parsed_schema_values def parse(self, schema_type_identifier, records: Iterable[MutableMapping[Any, Any]]): + """Removes duplicated fields and makes names conversion""" names_conversion = self.config.get("names_conversion", False) schema_pointer = schema_type_identifier.get("schema_pointer") key_pointer = schema_type_identifier["key_pointer"] @@ -148,15 +152,15 @@ def extract_properties_to_match(self, properties_to_match, schema_type_identifie return indexed_properties @staticmethod - def match_properties_with_values(unmatched_values: List[str], ordered_properties: Dict[int, str]): + def match_properties_with_values(unmatched_values: List[str], indexed_properties: Dict[int, str]): data = {} - for relevant_index in sorted(ordered_properties.keys()): + for relevant_index in sorted(indexed_properties.keys()): if relevant_index >= len(unmatched_values): break unmatch_value = unmatched_values[relevant_index] if unmatch_value.strip() != "": - data[ordered_properties[relevant_index]] = unmatch_value + data[indexed_properties[relevant_index]] = unmatch_value yield data @staticmethod @@ -187,6 +191,9 @@ def extract_records(self, response: requests.Response) -> Iterable[MutableMappin class DpathSchemaExtractor(DpathExtractor, RawSchemaParser): + """ + Makes names conversion and parses sheet headers from the provided row. + """ def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self.schema_type_identifier = parameters["schema_type_identifier"] diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index a1d3c345e87f3..8bdccc4504670 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -55,7 +55,7 @@ def authorize(http_mocker: HttpMocker): @staticmethod def get_spreadsheet_info_and_sheets( - http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200 + http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200, spreadsheet_id: Optional[str] = _SPREADSHEET_ID ): """ " Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order @@ -79,7 +79,7 @@ def get_spreadsheet_info_and_sheets( GoogleSheetsBaseTest.authorize(http_mocker) if streams_response_file: http_mocker.get( - RequestBuilder().with_spreadsheet_id(_SPREADSHEET_ID).with_include_grid_data(False).with_alt("json").build(), + RequestBuilder().with_spreadsheet_id(spreadsheet_id).with_include_grid_data(False).with_alt("json").build(), HttpResponse(json.dumps(find_template(streams_response_file, __file__)), meta_response_code), ) @@ -91,6 +91,7 @@ def get_sheet_first_row( stream_name: Optional[str] = _STREAM_NAME, data_initial_range_response_file: Optional[str] = None, data_initial_response_code: Optional[int] = 200, + spreadsheet_id: Optional[str] = _SPREADSHEET_ID, ): """ " Mock request to 'https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=true&ranges=!1:1&alt=json' @@ -136,7 +137,7 @@ def get_sheet_first_row( """ http_mocker.get( RequestBuilder() - .with_spreadsheet_id(_SPREADSHEET_ID) + .with_spreadsheet_id(spreadsheet_id) .with_include_grid_data(True) .with_ranges(f"{stream_name}!1:1") .with_alt("json") @@ -151,6 +152,7 @@ def get_stream_data( response_code: int = 200, stream_name: Optional[str] = _STREAM_NAME, request_range: Tuple = (2, 202), + spreadsheet_id: Optional[str] = _SPREADSHEET_ID, ): """ " Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' @@ -178,7 +180,7 @@ def get_stream_data( batch_request_ranges = f"{stream_name}!{start_range}:{end_range}" http_mocker.get( RequestBuilder.get_account_endpoint() - .with_spreadsheet_id(_SPREADSHEET_ID) + .with_spreadsheet_id(spreadsheet_id) .with_ranges(batch_request_ranges) .with_major_dimension("ROWS") .with_alt("json") diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py index ed8c22f3a31ab..244370df67d7b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py @@ -12,7 +12,7 @@ from .entrypoint_wrapper_helper import check -def _catalog(sync_mode: SyncMode, stream_name: str) -> ConfiguredAirbyteCatalog: +def catalog_helper(sync_mode: SyncMode, stream_name: str) -> ConfiguredAirbyteCatalog: return CatalogBuilder().with_stream(stream_name, sync_mode).build() @@ -22,14 +22,14 @@ def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Op def check_helper(config: Dict[str, Any], stream_name: str, expecting_exception: bool = False) -> EntrypointOutput: sync_mode = SyncMode.full_refresh - catalog = _catalog(sync_mode, stream_name) + catalog = catalog_helper(sync_mode, stream_name) source = _source(catalog=catalog, config=config, state={}) return check(source, config, expecting_exception) def discover_helper(config: Dict[str, Any], stream_name: str, expecting_exception: bool = False) -> EntrypointOutput: sync_mode = SyncMode.full_refresh - catalog = _catalog(sync_mode, stream_name) + catalog = catalog_helper(sync_mode, stream_name) source = _source(catalog=catalog, config=config, state={}) return discover(source, config, expecting_exception) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 5075e95959754..77ab77fb9f77e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -58,11 +58,11 @@ GET_STREAM_DATA = "get_stream_data" -class TestSource(GoogleSheetsBaseTest): +class TestSourceCheck(GoogleSheetsBaseTest): @HttpMocker() def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") - TestSource.get_sheet_first_row(http_mocker, "check_succeeded_range") + TestSourceCheck.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta") + TestSourceCheck.get_sheet_first_row(http_mocker, "check_succeeded_range") output = self._check(self._config, expecting_exception=False) expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) @@ -70,8 +70,8 @@ def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker @HttpMocker() def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "check_wrong_range", 200) + TestSourceCheck.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + TestSourceCheck.get_sheet_first_row(http_mocker, "check_wrong_range", 200) error_message = ( f"Unable to read the schema of sheet. Error: Unexpected return result: Sheet was expected to contain data on exactly 1 sheet." ) @@ -92,8 +92,8 @@ def test_check_expected_to_read_data_from_1_sheet(self, http_mocker: HttpMocker) @HttpMocker() def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: # With headers, we refer to properties that will be used for schema - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) + TestSourceCheck.get_spreadsheet_info_and_sheets(http_mocker, "check_succeeded_meta", 200) + TestSourceCheck.get_sheet_first_row(http_mocker, "check_duplicate_headers", 200) error_message = f"The following duplicate headers were found in the sheet. Please fix them to continue: ['header1']" output = self._check(self._config, expecting_exception=True) @@ -112,8 +112,8 @@ def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_stream(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "only_headers_range", 200) + TestSourceCheck.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + TestSourceCheck.get_sheet_first_row(http_mocker, "only_headers_range", 200) expected_schema = { "$schema": "http://json-schema.org/draft-07/schema#", @@ -132,6 +132,8 @@ def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_s output = self._discover(self._config, expecting_exception=False) assert output.catalog == expected_message + +class TestSourceDiscovery(GoogleSheetsBaseTest): @HttpMocker() def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: expected_schemas_properties = { @@ -139,10 +141,10 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: _B_STREAM_NAME: {"email": {"type": ["null", "string"]}, "name": {"type": ["null", "string"]}}, _C_STREAM_NAME: {"address": {"type": ["null", "string"]}}, } - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): @@ -170,8 +172,8 @@ def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMoc expected_schemas_properties = { _STREAM_NAME: {"name": {"type": ["null", "string"]}, "age": {"type": ["null", "string"]}}, } - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) - TestSource.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "discover_with_empty_column_spreadsheet_info_and_sheets", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"discover_with_empty_column_get_sheet_first_row", 200) expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): @@ -202,8 +204,8 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http "address2": {"type": ["null", "string"]}, } test_file_base_name = "discover_duplicated_headers" - TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") expected_schema = {"$schema": "http://json-schema.org/draft-07/schema#", "properties": expected_schema_properties, "type": "object"} expected_stream = AirbyteStream( @@ -224,8 +226,8 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http @HttpMocker() def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "names_conversion_range", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) expected_schema = { "$schema": "http://json-schema.org/draft-07/schema#", "properties": {"_1_test": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}, @@ -246,21 +248,23 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_given_grid_sheet_type_without_rows_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "no_rows_meta", 200) output = self._discover(self._config, expecting_exception=False) assert len(output.catalog.catalog.streams) == 0 @HttpMocker() def test_given_not_grid_sheet_type_when_discover_then_ignore_stream(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "non_grid_sheet_meta", 200) output = self._discover(self._config, expecting_exception=False) assert len(output.catalog.catalog.streams) == 0 + +class TestSourceRead(GoogleSheetsBaseTest): @HttpMocker() def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") - TestSource.get_sheet_first_row(http_mocker, "read_records_range") - TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range") + GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") first_property = "header_1" second_property = "header_2" configured_catalog = ( @@ -293,6 +297,7 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: assert len(output.records) == 2 assert output.records == expected_records + @HttpMocker() def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocker) -> None: """ @@ -300,9 +305,9 @@ def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocke discarded, in this case address and address2 shouldn't be part of the schema in records. """ test_file_base_name = "read_with_empty_column" - TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") first_property = "header_1" second_property = "header_2" configured_catalog = ( @@ -347,9 +352,9 @@ def test_when_read_with_duplicated_headers_then_return_records(self, http_mocker It will correctly match row values and field/column names in read records. """ test_file_base_name = "read_duplicated_headers" - TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") first_property = "header_1" second_property = "address" third_property = "address2" @@ -411,9 +416,9 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): There are two empty rows between id 16 and 20 that we will not be present in read records """ test_file_base_name = "read_empty_rows" - TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - TestSource.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{test_file_base_name}_{GET_STREAM_DATA}") expected_properties = ["id", "name", "normalized_name"] catalog_properties = {} for property in expected_properties: @@ -454,13 +459,13 @@ def test_when_empty_rows_then_return_records(self, http_mocker: HttpMocker): def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMocker): test_file_base_name = "read_by_batches" batch_size = 10 - TestSource.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") - TestSource.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") start_range = 2 for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): end_range = start_range + batch_size request_range = (start_range, end_range) - TestSource.get_stream_data( + GoogleSheetsBaseTest.get_stream_data( http_mocker, data_response_file=f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", request_range=request_range ) start_range += batch_size + 1 @@ -479,9 +484,9 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") - TestSource.get_sheet_first_row(http_mocker, "names_conversion_range") - TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "names_conversion_range") + GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions") first_expected_converted_property = "_1_test" second_expected_converted_property = "header_2" @@ -527,15 +532,15 @@ def test_when_read_then_return_records_with_name_conversion(self, http_mocker: H @HttpMocker() def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "multiple_streams_schemas_meta", 200) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) - TestSource.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) - TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range_2") - TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) - TestSource.get_stream_data(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range_2", stream_name=_C_STREAM_NAME) + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_STREAM_NAME}_range_2") + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"multiple_streams_schemas_{_C_STREAM_NAME}_range_2", stream_name=_C_STREAM_NAME) configured_catalog = ( CatalogBuilder() @@ -579,11 +584,60 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker for message in expected_messages: assert message in output.trace_messages + @HttpMocker() + def test_when_read_single_stream_with_multiple_streams_available_return_records_of_requested_stream(self, http_mocker: HttpMocker) -> None: + """" + Source has multiple sheets/stream but configured catalog will just request data for one sheet/stream + then we just get records for that stream. + """ + file_name_base = "multiple_streams_schemas" + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{file_name_base}_meta", 200) + + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{file_name_base}_{_STREAM_NAME}_range", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{file_name_base}_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{file_name_base}_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{file_name_base}_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) + + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_B_STREAM_NAME) + .with_json_schema({"properties": {"email": {"type": "string"}, "name": {"type": "string"}}}) + ) + .build() + ) + + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + assert len(output.records) == 2 + + assert len(output.state_messages) == 1 + state_messages_streams = [] + for state_message in output.state_messages: + state_messages_streams.append(state_message.state.stream.stream_descriptor.name) + + assert _STREAM_NAME not in state_messages_streams + assert _B_STREAM_NAME in state_messages_streams + assert _C_STREAM_NAME not in state_messages_streams + + expected_messages = [] + for current_stream in [_B_STREAM_NAME]: + for current_status in [AirbyteStreamStatus.COMPLETE, AirbyteStreamStatus.RUNNING, AirbyteStreamStatus.STARTED]: + stream_descriptor = StreamDescriptor(name=current_stream, namespace=None) + stream_status = AirbyteStreamStatusTraceMessage(status=current_status, stream_descriptor=stream_descriptor) + airbyte_trace_message = AirbyteTraceMessage(type=TraceType.STREAM_STATUS, emitted_at=ANY, stream_status=stream_status) + airbyte_message = AirbyteMessage(type=Type.TRACE, trace=airbyte_trace_message) + expected_messages.append(airbyte_message) + assert len(output.trace_messages) == len(expected_messages) + for message in expected_messages: + assert message in output.trace_messages + @HttpMocker() def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) - TestSource.get_sheet_first_row(http_mocker, "read_records_range_2", 200) - TestSource.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range_2", 200) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions_2") configured_catalog = ( CatalogBuilder() @@ -606,8 +660,8 @@ def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: Htt @HttpMocker() def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range_empty", 200) configured_catalog = ( CatalogBuilder() @@ -627,8 +681,8 @@ def test_read_empty_sheet(self, http_mocker: HttpMocker) -> None: @HttpMocker() def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: - TestSource.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) - TestSource.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range_with_unexpected_extra_sheet", 200) configured_catalog = ( CatalogBuilder() @@ -646,6 +700,74 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: ) assert output.errors[0].trace.error.message == expected_message + def _make_read_with_spreadsheet(self,http_mocker: HttpMocker, spreadsheet_id: str, spreadsheet_id_for_config: str): + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", spreadsheet_id=spreadsheet_id) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", spreadsheet_id=spreadsheet_id) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions", spreadsheet_id=spreadsheet_id) + first_property = "header_1" + second_property = "header_2" + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema( + {"properties": {first_property: {"type": ["null", "string"]}, second_property: {"type": ["null", "string"]}}} + ) + ) + .build() + ) + + config_with_other_spreadsheet_format = deepcopy(self._config) + config_with_other_spreadsheet_format["spreadsheet_id"] = spreadsheet_id_for_config + output = self._read(config_with_other_spreadsheet_format, catalog=configured_catalog, expecting_exception=False) + expected_records = [ + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_11", second_property: "value_12"} + ), + ), + AirbyteMessage( + type=Type.RECORD, + record=AirbyteRecordMessage( + emitted_at=ANY, stream=_STREAM_NAME, data={first_property: "value_21", second_property: "value_22"} + ), + ), + ] + assert len(output.records) == 2 + assert output.records == expected_records + + @HttpMocker() + def test_spreadsheet_url_with_edit_and_gid_in_path(self, http_mocker: HttpMocker) -> None: + spreadsheet_id = "18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q" + spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q/edit#gid=1820065035" + self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + + @HttpMocker() + def test_spreadsheet_url_with_edit_in_path(self, http_mocker: HttpMocker) -> None: + spreadsheet_id = "18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q" + spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q/edit" + self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + + @HttpMocker() + def test_spreadsheet_path(self, http_mocker: HttpMocker) -> None: + spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" + spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/" + self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + + @HttpMocker() + def test_spreadsheet_url_with_pound_in_path(self, http_mocker: HttpMocker) -> None: + spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" + spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/#" + self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + + @HttpMocker() + def test_spreadsheet_id(self, http_mocker: HttpMocker) -> None: + spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" + spreadsheet_id_for_config = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" + self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): pass diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py new file mode 100644 index 0000000000000..bc2e625152034 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -0,0 +1,172 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +import io +import json +from typing import Dict, List, Union + +import pytest +import requests +import dpath + +from airbyte_cdk.sources.declarative.decoders.json_decoder import ( + IterableDecoder, + JsonDecoder, +) +from airbyte_cdk.connector_builder.connector_builder_handler import resolve_manifest +from airbyte_cdk.models import SyncMode + +from source_google_sheets.components import DpathSchemaExtractor, DpathSchemaMatchingExtractor +from source_google_sheets.components.extractors import RawSchemaParser +from source_google_sheets import SourceGoogleSheets + +from unit_tests.integration.protocol_helpers import catalog_helper +from unit_tests.integration.mock_credentials import oauth_credentials + +config = {"field": "record_array"} +parameters = {"schema_type_identifier": {"key_pointer": ["formattedValue"], "schema_pointer": ["values"]}} + +decoder_json = JsonDecoder(parameters={}) +decoder_iterable = IterableDecoder(parameters={}) + + +def create_response(body: Union[Dict, bytes]): + response = requests.Response() + response.raw = io.BytesIO(body if isinstance(body, bytes) else json.dumps(body).encode("utf-8")) + return response + + + +_CONFIG = {"spreadsheet_id": "_spread_sheet_id", "credentials": oauth_credentials, "batch_size": 200} +_MANIFEST = resolve_manifest(source=SourceGoogleSheets(catalog=catalog_helper(SyncMode.full_refresh, "a_stream"),config=_CONFIG, state={})).record.data["manifest"] +_FIELD_PATH = list(dpath.get(obj=_MANIFEST, glob=["dynamic_streams", 0, 'stream_template', 'schema_loader', 'retriever', 'record_selector', 'extractor', 'field_path'], default=[])) +_SCHEMA_TYPE_IDENTIFIERS = dpath.get(obj=_MANIFEST, glob=['definitions', 'schema_type_identifier']) + +@pytest.mark.parametrize( + "body, expected_records", + [ + ( + {'sheets': [ + {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}]}]}]}, + [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}] + ), + ( + {'sheets': [ + {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h1'}, {'formattedValue': 'h3'}]}]}]}]}, + [{'values': [{'formattedValue': 'h3'}]}] + ), + ( + {'sheets': [ + {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h3'}, {'formattedValue': 'h3'}]}]}]}]}, + [{'values': [{'formattedValue': 'h1'}]}] + ), + ( + {'sheets': [ + {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': ''}, {'formattedValue': 'h3'}]}]}]}]}, + [{'values': [{'formattedValue': 'h1'}]}] + ), + ( + {'sheets': [ + {'data': [{'rowData': [{'values': [{'formattedValue': ''}, {'formattedValue': ''}, {'formattedValue': ''}]}]}]}]}, + [{'values': []}] + ), + ], + ids=[ + "test_headers", + "test_duplicate_headers_retrieved", + "test_duplicate_headers_retrieved_not_first_position", + "test_blank_values_terminate_row", + "test_is_row_empty_with_empty_row" + ], +) +def test_dpath_schema_extractor(body, expected_records: List): + extractor = DpathSchemaExtractor( + field_path=_FIELD_PATH, config=config, decoder=decoder_json, parameters=parameters + ) + + response = create_response(body) + actual_records = list(extractor.extract_records(response)) + + assert actual_records == expected_records + +@pytest.mark.parametrize( + "raw_schema_data, expected_data", + [ + ( + {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}, + [(0, 'h1', {'formattedValue': 'h1'}), (1, 'h2', {'formattedValue': 'h2'}), (2, 'h3', {'formattedValue': 'h3'})] + ), + ( + {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h1'}, {'formattedValue': 'h3'}]}, + [(2, 'h3', {'formattedValue': 'h3'})] + ), + ( + {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h3'}, {'formattedValue': 'h3'}]}, + [(0, 'h1', {'formattedValue': 'h1'})] + ), + ( + {'values': [{'formattedValue': 'h1'}, {'formattedValue': ''}, {'formattedValue': 'h3'}]}, + [(0, 'h1', {'formattedValue': 'h1'})] + ), + ( + {'values': [{'formattedValue': ''}, {'formattedValue': ''}, {'formattedValue': ''}]}, + [] + ), + ], + ids=[ + "test_headers", + "test_duplicate_headers_retrieved", + "test_duplicate_headers_retrieved_not_first_position", + "test_blank_values_terminate_row", + "test_is_row_empty_with_empty_row" + ], +) +def test_parse_raw_schema_value(raw_schema_data, expected_data): + extractor = RawSchemaParser() + parsed_data = extractor.parse_raw_schema_values(raw_schema_data, schema_pointer=_SCHEMA_TYPE_IDENTIFIERS['schema_pointer'], key_pointer=_SCHEMA_TYPE_IDENTIFIERS['key_pointer'], names_conversion=False) + assert parsed_data == expected_data + +@pytest.mark.parametrize( + "values, expected_response", + [ + ( + [" ", "", " "], + True + ), + ( + [" ", "", " ", "some_value_here"], + False + ) + ], + ids=[ + "with_empty_row", + "with_full_row" + ] +) +def test_is_row_empty(values, expected_response): + is_row_empty = DpathSchemaMatchingExtractor.is_row_empty(values) + assert is_row_empty == expected_response + +@pytest.mark.parametrize( + "values, relevant_indices, expected_response", + [ + ( + ["c1", "c2", "c3"], + [2], + True + ), + ( + ["", "", "c3"], + [0, 1], + False + ) + ], + ids=[ + "is_true", + "is_false" + ] +) +def test_row_contains_relevant_data(values, relevant_indices, expected_response): + is_row_empty = DpathSchemaMatchingExtractor.row_contains_relevant_data(values, relevant_indices) + assert is_row_empty == expected_response From c0e9e6ffee02fc6030381f7c84bad096bfa692f8 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 2 Jan 2025 19:20:42 -0600 Subject: [PATCH 22/63] source-google-sheets: ruff fix format --- .../components/extractors.py | 1 + .../integration/google_sheets_base_test.py | 5 +- .../unit_tests/integration/test_source.py | 33 ++-- .../unit_tests/test_components.py | 150 ++++++++---------- 4 files changed, 96 insertions(+), 93 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 86e0d26f12509..6fc48c4b46650 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -194,6 +194,7 @@ class DpathSchemaExtractor(DpathExtractor, RawSchemaParser): """ Makes names conversion and parses sheet headers from the provided row. """ + def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self.schema_type_identifier = parameters["schema_type_identifier"] diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index 8bdccc4504670..d5a6f6f159944 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -55,7 +55,10 @@ def authorize(http_mocker: HttpMocker): @staticmethod def get_spreadsheet_info_and_sheets( - http_mocker: HttpMocker, streams_response_file: Optional[str] = None, meta_response_code: Optional[int] = 200, spreadsheet_id: Optional[str] = _SPREADSHEET_ID + http_mocker: HttpMocker, + streams_response_file: Optional[str] = None, + meta_response_code: Optional[int] = 200, + spreadsheet_id: Optional[str] = _SPREADSHEET_ID, ): """ " Mock request to https://sheets.googleapis.com/v4/spreadsheets/?includeGridData=false&alt=json in order diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 77ab77fb9f77e..0a3f260390f28 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -297,7 +297,6 @@ def test_when_read_then_return_records(self, http_mocker: HttpMocker) -> None: assert len(output.records) == 2 assert output.records == expected_records - @HttpMocker() def test_when_read_empty_column_then_return_records(self, http_mocker: HttpMocker) -> None: """ @@ -585,8 +584,10 @@ def test_when_read_multiple_streams_return_records(self, http_mocker: HttpMocker assert message in output.trace_messages @HttpMocker() - def test_when_read_single_stream_with_multiple_streams_available_return_records_of_requested_stream(self, http_mocker: HttpMocker) -> None: - """" + def test_when_read_single_stream_with_multiple_streams_available_return_records_of_requested_stream( + self, http_mocker: HttpMocker + ) -> None: + """ " Source has multiple sheets/stream but configured catalog will just request data for one sheet/stream then we just get records for that stream. """ @@ -700,7 +701,7 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: ) assert output.errors[0].trace.error.message == expected_message - def _make_read_with_spreadsheet(self,http_mocker: HttpMocker, spreadsheet_id: str, spreadsheet_id_for_config: str): + def _make_read_with_spreadsheet(self, http_mocker: HttpMocker, spreadsheet_id: str, spreadsheet_id_for_config: str): GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", spreadsheet_id=spreadsheet_id) GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", spreadsheet_id=spreadsheet_id) GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions", spreadsheet_id=spreadsheet_id) @@ -741,32 +742,44 @@ def _make_read_with_spreadsheet(self,http_mocker: HttpMocker, spreadsheet_id: st @HttpMocker() def test_spreadsheet_url_with_edit_and_gid_in_path(self, http_mocker: HttpMocker) -> None: spreadsheet_id = "18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q" - spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q/edit#gid=1820065035" - self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + spreadsheet_id_for_config = ( + "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q/edit#gid=1820065035" + ) + self._make_read_with_spreadsheet( + http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + ) @HttpMocker() def test_spreadsheet_url_with_edit_in_path(self, http_mocker: HttpMocker) -> None: spreadsheet_id = "18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q/edit" - self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + self._make_read_with_spreadsheet( + http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + ) @HttpMocker() def test_spreadsheet_path(self, http_mocker: HttpMocker) -> None: spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/" - self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + self._make_read_with_spreadsheet( + http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + ) @HttpMocker() def test_spreadsheet_url_with_pound_in_path(self, http_mocker: HttpMocker) -> None: spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/#" - self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + self._make_read_with_spreadsheet( + http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + ) @HttpMocker() def test_spreadsheet_id(self, http_mocker: HttpMocker) -> None: spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" spreadsheet_id_for_config = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" - self._make_read_with_spreadsheet(http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config) + self._make_read_with_spreadsheet( + http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + ) @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py index bc2e625152034..7188e8e0c0672 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -6,23 +6,22 @@ import json from typing import Dict, List, Union +import dpath import pytest import requests -import dpath +from source_google_sheets import SourceGoogleSheets +from source_google_sheets.components import DpathSchemaExtractor, DpathSchemaMatchingExtractor +from source_google_sheets.components.extractors import RawSchemaParser +from unit_tests.integration.mock_credentials import oauth_credentials +from unit_tests.integration.protocol_helpers import catalog_helper +from airbyte_cdk.connector_builder.connector_builder_handler import resolve_manifest +from airbyte_cdk.models import SyncMode from airbyte_cdk.sources.declarative.decoders.json_decoder import ( IterableDecoder, JsonDecoder, ) -from airbyte_cdk.connector_builder.connector_builder_handler import resolve_manifest -from airbyte_cdk.models import SyncMode -from source_google_sheets.components import DpathSchemaExtractor, DpathSchemaMatchingExtractor -from source_google_sheets.components.extractors import RawSchemaParser -from source_google_sheets import SourceGoogleSheets - -from unit_tests.integration.protocol_helpers import catalog_helper -from unit_tests.integration.mock_credentials import oauth_credentials config = {"field": "record_array"} parameters = {"schema_type_identifier": {"key_pointer": ["formattedValue"], "schema_pointer": ["values"]}} @@ -37,39 +36,58 @@ def create_response(body: Union[Dict, bytes]): return response - _CONFIG = {"spreadsheet_id": "_spread_sheet_id", "credentials": oauth_credentials, "batch_size": 200} -_MANIFEST = resolve_manifest(source=SourceGoogleSheets(catalog=catalog_helper(SyncMode.full_refresh, "a_stream"),config=_CONFIG, state={})).record.data["manifest"] -_FIELD_PATH = list(dpath.get(obj=_MANIFEST, glob=["dynamic_streams", 0, 'stream_template', 'schema_loader', 'retriever', 'record_selector', 'extractor', 'field_path'], default=[])) -_SCHEMA_TYPE_IDENTIFIERS = dpath.get(obj=_MANIFEST, glob=['definitions', 'schema_type_identifier']) +_MANIFEST = resolve_manifest( + source=SourceGoogleSheets(catalog=catalog_helper(SyncMode.full_refresh, "a_stream"), config=_CONFIG, state={}) +).record.data["manifest"] +_FIELD_PATH = list( + dpath.get( + obj=_MANIFEST, + glob=["dynamic_streams", 0, "stream_template", "schema_loader", "retriever", "record_selector", "extractor", "field_path"], + default=[], + ) +) +_SCHEMA_TYPE_IDENTIFIERS = dpath.get(obj=_MANIFEST, glob=["definitions", "schema_type_identifier"]) + @pytest.mark.parametrize( "body, expected_records", [ ( - {'sheets': [ - {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}]}]}]}, - [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}] + { + "sheets": [ + {"data": [{"rowData": [{"values": [{"formattedValue": "h1"}, {"formattedValue": "h2"}, {"formattedValue": "h3"}]}]}]} + ] + }, + [{"values": [{"formattedValue": "h1"}, {"formattedValue": "h2"}, {"formattedValue": "h3"}]}], ), ( - {'sheets': [ - {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h1'}, {'formattedValue': 'h3'}]}]}]}]}, - [{'values': [{'formattedValue': 'h3'}]}] + { + "sheets": [ + {"data": [{"rowData": [{"values": [{"formattedValue": "h1"}, {"formattedValue": "h1"}, {"formattedValue": "h3"}]}]}]} + ] + }, + [{"values": [{"formattedValue": "h3"}]}], ), ( - {'sheets': [ - {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h3'}, {'formattedValue': 'h3'}]}]}]}]}, - [{'values': [{'formattedValue': 'h1'}]}] + { + "sheets": [ + {"data": [{"rowData": [{"values": [{"formattedValue": "h1"}, {"formattedValue": "h3"}, {"formattedValue": "h3"}]}]}]} + ] + }, + [{"values": [{"formattedValue": "h1"}]}], ), ( - {'sheets': [ - {'data': [{'rowData': [{'values': [{'formattedValue': 'h1'}, {'formattedValue': ''}, {'formattedValue': 'h3'}]}]}]}]}, - [{'values': [{'formattedValue': 'h1'}]}] + { + "sheets": [ + {"data": [{"rowData": [{"values": [{"formattedValue": "h1"}, {"formattedValue": ""}, {"formattedValue": "h3"}]}]}]} + ] + }, + [{"values": [{"formattedValue": "h1"}]}], ), ( - {'sheets': [ - {'data': [{'rowData': [{'values': [{'formattedValue': ''}, {'formattedValue': ''}, {'formattedValue': ''}]}]}]}]}, - [{'values': []}] + {"sheets": [{"data": [{"rowData": [{"values": [{"formattedValue": ""}, {"formattedValue": ""}, {"formattedValue": ""}]}]}]}]}, + [{"values": []}], ), ], ids=[ @@ -77,95 +95,63 @@ def create_response(body: Union[Dict, bytes]): "test_duplicate_headers_retrieved", "test_duplicate_headers_retrieved_not_first_position", "test_blank_values_terminate_row", - "test_is_row_empty_with_empty_row" + "test_is_row_empty_with_empty_row", ], ) def test_dpath_schema_extractor(body, expected_records: List): - extractor = DpathSchemaExtractor( - field_path=_FIELD_PATH, config=config, decoder=decoder_json, parameters=parameters - ) + extractor = DpathSchemaExtractor(field_path=_FIELD_PATH, config=config, decoder=decoder_json, parameters=parameters) response = create_response(body) actual_records = list(extractor.extract_records(response)) assert actual_records == expected_records + @pytest.mark.parametrize( "raw_schema_data, expected_data", [ ( - {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h2'}, {'formattedValue': 'h3'}]}, - [(0, 'h1', {'formattedValue': 'h1'}), (1, 'h2', {'formattedValue': 'h2'}), (2, 'h3', {'formattedValue': 'h3'})] - ), - ( - {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h1'}, {'formattedValue': 'h3'}]}, - [(2, 'h3', {'formattedValue': 'h3'})] - ), - ( - {'values': [{'formattedValue': 'h1'}, {'formattedValue': 'h3'}, {'formattedValue': 'h3'}]}, - [(0, 'h1', {'formattedValue': 'h1'})] - ), - ( - {'values': [{'formattedValue': 'h1'}, {'formattedValue': ''}, {'formattedValue': 'h3'}]}, - [(0, 'h1', {'formattedValue': 'h1'})] - ), - ( - {'values': [{'formattedValue': ''}, {'formattedValue': ''}, {'formattedValue': ''}]}, - [] + {"values": [{"formattedValue": "h1"}, {"formattedValue": "h2"}, {"formattedValue": "h3"}]}, + [(0, "h1", {"formattedValue": "h1"}), (1, "h2", {"formattedValue": "h2"}), (2, "h3", {"formattedValue": "h3"})], ), + ({"values": [{"formattedValue": "h1"}, {"formattedValue": "h1"}, {"formattedValue": "h3"}]}, [(2, "h3", {"formattedValue": "h3"})]), + ({"values": [{"formattedValue": "h1"}, {"formattedValue": "h3"}, {"formattedValue": "h3"}]}, [(0, "h1", {"formattedValue": "h1"})]), + ({"values": [{"formattedValue": "h1"}, {"formattedValue": ""}, {"formattedValue": "h3"}]}, [(0, "h1", {"formattedValue": "h1"})]), + ({"values": [{"formattedValue": ""}, {"formattedValue": ""}, {"formattedValue": ""}]}, []), ], ids=[ "test_headers", "test_duplicate_headers_retrieved", "test_duplicate_headers_retrieved_not_first_position", "test_blank_values_terminate_row", - "test_is_row_empty_with_empty_row" + "test_is_row_empty_with_empty_row", ], ) def test_parse_raw_schema_value(raw_schema_data, expected_data): extractor = RawSchemaParser() - parsed_data = extractor.parse_raw_schema_values(raw_schema_data, schema_pointer=_SCHEMA_TYPE_IDENTIFIERS['schema_pointer'], key_pointer=_SCHEMA_TYPE_IDENTIFIERS['key_pointer'], names_conversion=False) + parsed_data = extractor.parse_raw_schema_values( + raw_schema_data, + schema_pointer=_SCHEMA_TYPE_IDENTIFIERS["schema_pointer"], + key_pointer=_SCHEMA_TYPE_IDENTIFIERS["key_pointer"], + names_conversion=False, + ) assert parsed_data == expected_data + @pytest.mark.parametrize( "values, expected_response", - [ - ( - [" ", "", " "], - True - ), - ( - [" ", "", " ", "some_value_here"], - False - ) - ], - ids=[ - "with_empty_row", - "with_full_row" - ] + [([" ", "", " "], True), ([" ", "", " ", "some_value_here"], False)], + ids=["with_empty_row", "with_full_row"], ) def test_is_row_empty(values, expected_response): is_row_empty = DpathSchemaMatchingExtractor.is_row_empty(values) assert is_row_empty == expected_response + @pytest.mark.parametrize( "values, relevant_indices, expected_response", - [ - ( - ["c1", "c2", "c3"], - [2], - True - ), - ( - ["", "", "c3"], - [0, 1], - False - ) - ], - ids=[ - "is_true", - "is_false" - ] + [(["c1", "c2", "c3"], [2], True), (["", "", "c3"], [0, 1], False)], + ids=["is_true", "is_false"], ) def test_row_contains_relevant_data(values, relevant_indices, expected_response): is_row_empty = DpathSchemaMatchingExtractor.row_contains_relevant_data(values, relevant_indices) From ba3620bd4c7a6b89458ebbbb66d8170a8679a7a1 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Fri, 3 Jan 2025 17:16:16 -0600 Subject: [PATCH 23/63] source-google-sheets: add tests for parsing spreadsheet_id in config and unavailable stream --- .../unit_tests/integration/test_source.py | 94 ++++++++++++++++--- 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 0a3f260390f28..f3710e9856923 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -634,6 +634,71 @@ def test_when_read_single_stream_with_multiple_streams_available_return_records_ for message in expected_messages: assert message in output.trace_messages + @HttpMocker() + def test_when_read_stream_is_not_available_then_is_marked_incomplete(self, http_mocker: HttpMocker) -> None: + """ + Configured catalog will include a streams that is not available in first row response, so it will be marked as incomplete. + """ + base_file_name = "multiple_streams_schemas" + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{base_file_name}_meta", 200) + + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{base_file_name}_{_STREAM_NAME}_range", 200) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{base_file_name}_{_B_STREAM_NAME}_range", 200, _B_STREAM_NAME) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{base_file_name}_{_C_STREAM_NAME}_range", 200, _C_STREAM_NAME) + + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{base_file_name}_{_STREAM_NAME}_range_2") + GoogleSheetsBaseTest.get_stream_data(http_mocker, f"{base_file_name}_{_B_STREAM_NAME}_range_2", stream_name=_B_STREAM_NAME) + + unavailable_stream = "unavailable_stream" + configured_catalog = ( + CatalogBuilder() + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_STREAM_NAME) + .with_json_schema({"properties": {"age": {"type": "string"}, "name": {"type": "string"}}}) + ) + .with_stream( + ConfiguredAirbyteStreamBuilder() + .with_name(_B_STREAM_NAME) + .with_json_schema({"properties": {"email": {"type": "string"}, "name": {"type": "string"}}}) + ) + .with_stream( + ConfiguredAirbyteStreamBuilder().with_name(unavailable_stream).with_json_schema({"properties": {"address": {"type": "string"}}}) + ) + .build() + ) + + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + a_and_b_stream_records_count = 5 + assert len(output.records) == a_and_b_stream_records_count + + catalog_available_streams = [_STREAM_NAME, _B_STREAM_NAME] + assert len(output.state_messages) == len(catalog_available_streams) + state_messages_streams = [] + for state_message in output.state_messages: + state_messages_streams.append(state_message.state.stream.stream_descriptor.name) + + assert _STREAM_NAME in state_messages_streams + assert _B_STREAM_NAME in state_messages_streams + + expected_messages = [] + for current_stream in catalog_available_streams: + for current_status in [AirbyteStreamStatus.COMPLETE, AirbyteStreamStatus.RUNNING, AirbyteStreamStatus.STARTED]: + stream_descriptor = StreamDescriptor(name=current_stream, namespace=None) + stream_status = AirbyteStreamStatusTraceMessage(status=current_status, stream_descriptor=stream_descriptor) + airbyte_trace_message = AirbyteTraceMessage(type=TraceType.STREAM_STATUS, emitted_at=ANY, stream_status=stream_status) + airbyte_message = AirbyteMessage(type=Type.TRACE, trace=airbyte_trace_message) + expected_messages.append(airbyte_message) + + stream_descriptor = StreamDescriptor(name=unavailable_stream, namespace=None) + stream_status = AirbyteStreamStatusTraceMessage(status=AirbyteStreamStatus.INCOMPLETE, stream_descriptor=stream_descriptor) + airbyte_trace_message = AirbyteTraceMessage(type=TraceType.STREAM_STATUS, emitted_at=ANY, stream_status=stream_status) + airbyte_message_incomplete_stream = AirbyteMessage(type=Type.TRACE, trace=airbyte_trace_message) + expected_messages.append(airbyte_message_incomplete_stream) + assert len(output.trace_messages) == len(expected_messages) + for message in expected_messages: + assert message in output.trace_messages + @HttpMocker() def test_when_read_then_status_and_state_messages_emitted(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta_2", 200) @@ -701,10 +766,10 @@ def test_read_expected_data_on_1_sheet(self, http_mocker: HttpMocker) -> None: ) assert output.errors[0].trace.error.message == expected_message - def _make_read_with_spreadsheet(self, http_mocker: HttpMocker, spreadsheet_id: str, spreadsheet_id_for_config: str): - GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", spreadsheet_id=spreadsheet_id) - GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", spreadsheet_id=spreadsheet_id) - GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions", spreadsheet_id=spreadsheet_id) + def _make_read_with_spreadsheet(self, http_mocker: HttpMocker, spreadsheet_id_to_mock: str, spreadsheet_id_for_config: str): + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "read_records_meta", spreadsheet_id=spreadsheet_id_to_mock) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "read_records_range", spreadsheet_id=spreadsheet_id_to_mock) + GoogleSheetsBaseTest.get_stream_data(http_mocker, "read_records_range_with_dimensions", spreadsheet_id=spreadsheet_id_to_mock) first_property = "header_1" second_property = "header_2" configured_catalog = ( @@ -741,46 +806,47 @@ def _make_read_with_spreadsheet(self, http_mocker: HttpMocker, spreadsheet_id: s @HttpMocker() def test_spreadsheet_url_with_edit_and_gid_in_path(self, http_mocker: HttpMocker) -> None: - spreadsheet_id = "18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q" + spreadsheet_id_to_mock = "18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q" spreadsheet_id_for_config = ( "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q/edit#gid=1820065035" ) self._make_read_with_spreadsheet( - http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + http_mocker=http_mocker, spreadsheet_id_to_mock=spreadsheet_id_to_mock, spreadsheet_id_for_config=spreadsheet_id_for_config ) @HttpMocker() def test_spreadsheet_url_with_edit_in_path(self, http_mocker: HttpMocker) -> None: - spreadsheet_id = "18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q" + spreadsheet_id_to_mock = "18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q/edit" self._make_read_with_spreadsheet( - http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + http_mocker=http_mocker, spreadsheet_id_to_mock=spreadsheet_id_to_mock, spreadsheet_id_for_config=spreadsheet_id_for_config ) @HttpMocker() def test_spreadsheet_path(self, http_mocker: HttpMocker) -> None: - spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" + spreadsheet_id_to_mock = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/" self._make_read_with_spreadsheet( - http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + http_mocker=http_mocker, spreadsheet_id_to_mock=spreadsheet_id_to_mock, spreadsheet_id_for_config=spreadsheet_id_for_config ) @HttpMocker() def test_spreadsheet_url_with_pound_in_path(self, http_mocker: HttpMocker) -> None: - spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" + spreadsheet_id_to_mock = "18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q" spreadsheet_id_for_config = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/#" self._make_read_with_spreadsheet( - http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + http_mocker=http_mocker, spreadsheet_id_to_mock=spreadsheet_id_to_mock, spreadsheet_id_for_config=spreadsheet_id_for_config ) @HttpMocker() def test_spreadsheet_id(self, http_mocker: HttpMocker) -> None: - spreadsheet_id = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" + spreadsheet_id_to_mock = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" spreadsheet_id_for_config = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" self._make_read_with_spreadsheet( - http_mocker=http_mocker, spreadsheet_id=spreadsheet_id, spreadsheet_id_for_config=spreadsheet_id_for_config + http_mocker=http_mocker, spreadsheet_id_to_mock=spreadsheet_id_to_mock, spreadsheet_id_for_config=spreadsheet_id_for_config ) @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): pass + From a35f07ffd045ed18a7583c9b03cad5b4529df55c Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Fri, 3 Jan 2025 17:18:35 -0600 Subject: [PATCH 24/63] source-google-sheets: ruff-format --- .../unit_tests/integration/test_source.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index f3710e9856923..4dea1d31f6db7 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -663,7 +663,9 @@ def test_when_read_stream_is_not_available_then_is_marked_incomplete(self, http_ .with_json_schema({"properties": {"email": {"type": "string"}, "name": {"type": "string"}}}) ) .with_stream( - ConfiguredAirbyteStreamBuilder().with_name(unavailable_stream).with_json_schema({"properties": {"address": {"type": "string"}}}) + ConfiguredAirbyteStreamBuilder() + .with_name(unavailable_stream) + .with_json_schema({"properties": {"address": {"type": "string"}}}) ) .build() ) @@ -849,4 +851,3 @@ def test_spreadsheet_id(self, http_mocker: HttpMocker) -> None: @pytest.mark.skip("Pending to do") def test_for_increase_batch_size_when_rate_limit(self): pass - From 7ed534a7d93545203b59056f76241271e83dff5f Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Sun, 5 Jan 2025 21:35:11 -0800 Subject: [PATCH 25/63] source-google-sheets: add manager for to increase batch size when 429 code in response --- .../batch_size_manager.py | 27 ++ .../components/__init__.py | 4 +- .../components/error_handlers.py | 25 ++ .../components/extractors.py | 2 + .../components/partition_routers.py | 7 +- .../components/retrievers.py | 19 ++ .../source_google_sheets/manifest.yaml | 31 +- .../integration/google_sheets_base_test.py | 11 +- .../integration/test_exception_description.py | 4 +- .../unit_tests/integration/test_source.py | 36 ++ ...read_by_batches_get_sheet_first_row_2.json | 313 ++++++++++++++++++ ...ead_by_batches_get_spreadsheet_info_2.json | 149 +++++++++ 12 files changed, 604 insertions(+), 24 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row_2.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info_2.json diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py new file mode 100644 index 0000000000000..478fef2e7d6cc --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py @@ -0,0 +1,27 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + +import logging + +logger = logging.getLogger("airbyte") + +class BatchSizeManager: + _instance = None + + def __new__(cls, initial_batch_size=200): + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance.batch_size = initial_batch_size + return cls._instance + + def get_batch_size(self) -> int: + return self._instance.batch_size + + def update_batch_size(self, new_batch_size: int) -> None: + self._instance.batch_size = new_batch_size + logger.info(f"Increasing number of records fetching due to rate limits. Current value: {self._instance.batch_size}") + + @classmethod + def reset(cls): + cls._instance = None diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index 9e0ca0009ff99..26842b5936c4c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,4 +1,6 @@ from source_google_sheets.components.extractors import DpathSchemaMatchingExtractor, DpathSchemaExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter +from source_google_sheets.components.error_handlers import SheetDataErrorHandler +from source_google_sheets.components.retrievers import SheetsDataRetriever -__all__ = ["DpathSchemaMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor"] +__all__ = ["DpathSchemaMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor", "SheetDataErrorHandler", "SheetsDataRetriever"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py new file mode 100644 index 0000000000000..605c55ac82127 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py @@ -0,0 +1,25 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + +from dataclasses import dataclass +from typing import Optional, Union +from requests.status_codes import codes as status_codes + +import requests + +from airbyte_cdk.sources.streams.http.error_handlers.response_models import ( + ErrorResolution, +) +from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler +from source_google_sheets.batch_size_manager import BatchSizeManager + +@dataclass +class SheetDataErrorHandler(DefaultErrorHandler): + def interpret_response( + self, response_or_exception: Optional[Union[requests.Response, Exception]] + ) -> ErrorResolution: + if response_or_exception.status_code == status_codes.TOO_MANY_REQUESTS: + batch_size_manager = BatchSizeManager() + batch_size_manager.update_batch_size(batch_size_manager.get_batch_size() + 100) + return super().interpret_response(response_or_exception) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 6fc48c4b46650..820488ae56426 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -7,6 +7,7 @@ import dpath import requests +from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString from airbyte_cdk.sources.types import Config @@ -134,6 +135,7 @@ class DpathSchemaMatchingExtractor(DpathExtractor, RawSchemaParser): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) + self.decoder = JsonDecoder(parameters={}) self._values_to_match_key = parameters["values_to_match_key"] schema_type_identifier = parameters["schema_type_identifier"] names_conversion = self.config.get("names_conversion", False) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 6fb24966774bf..b869d9c5f4b32 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -3,6 +3,7 @@ # from typing import Any, Iterable, Mapping +from source_google_sheets.batch_size_manager import BatchSizeManager from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter from airbyte_cdk.sources.types import StreamSlice @@ -18,11 +19,11 @@ def __init__(self, parameters: Mapping[str, Any]) -> None: super().__init__(parameters) self.parameters = parameters self.sheet_row_count = parameters.get("row_count", 0) - self.batch_size = parameters.get("batch_size", 200) + self.batch_size_manager = BatchSizeManager(parameters.get("batch_size", 200)) def stream_slices(self) -> Iterable[StreamSlice]: start_range = 2 while start_range <= self.sheet_row_count: - end_range = start_range + self.batch_size + end_range = start_range + self.batch_size_manager.get_batch_size() yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) - start_range += self.batch_size + 1 + start_range = end_range + 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py new file mode 100644 index 0000000000000..5001400f74446 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -0,0 +1,19 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# +from dataclasses import dataclass +from typing import Any, Mapping + +from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever +from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer +from source_google_sheets.components import RangePartitionRouter + + +@dataclass +class SheetsDataRetriever(SimpleRetriever): + def __post_init__(self, parameters: Mapping[str, Any]) -> None: + super().__post_init__(parameters) + self.stream_slicer: StreamSlicer = RangePartitionRouter( + parameters={"batch_size":self.config.get("batch_size", 200), "row_count": parameters.get("row_count", 0) } + ) + diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index eaa47cde7728b..e878415e11b24 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -13,17 +13,15 @@ dynamic_streams: name: "" primary_key: [] retriever: - type: SimpleRetriever - partition_router: - type: CustomPartitionRouter - $parameters: - row_count: 0 - batch_size: 0 - class_name: source_google_sheets.components.RangePartitionRouter - description: Partition router that generates ranges for batch fetching. + type: CustomRetriever + class_name: "source_google_sheets.components.SheetsDataRetriever" + $parameters: + row_count: 0 paginator: type: NoPagination record_selector: + decoder: + type: JsonDecoder extractor: type: CustomRecordExtractor class_name: source_google_sheets.components.DpathSchemaMatchingExtractor @@ -48,11 +46,10 @@ dynamic_streams: path: >- {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - response_filters: - $ref: "#/definitions/response_filters/response_error_filters" + type: CustomErrorHandler + class_name: source_google_sheets.components.SheetDataErrorHandler + response_filters: + $ref: "#/definitions/response_filters/response_error_filters" schema_loader: type: DynamicSchemaLoader retriever: @@ -128,7 +125,6 @@ dynamic_streams: description: indexed_schema to match with row values. - field_path: - retriever - - partition_router - $parameters - row_count type: ComponentMappingDefinition @@ -371,3 +367,10 @@ schemas: type: - string - "null" + + + +concurrency_level: + type: ConcurrencyLevel + default_concurrency: 1 + max_concurrency: 1 \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index d5a6f6f159944..65a28b82fdadb 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -4,7 +4,7 @@ import json from abc import ABC from copy import deepcopy -from typing import Any, Dict, Optional, Tuple +from typing import Any, Dict, Optional, Tuple, Union, List from unittest import TestCase from airbyte_cdk.models import ( @@ -14,6 +14,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template +from source_google_sheets.batch_size_manager import BatchSizeManager from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials from .protocol_helpers import check_helper, discover_helper, read_helper from .request_builder import AuthBuilder, RequestBuilder @@ -32,6 +33,7 @@ class GoogleSheetsBaseTest(TestCase, ABC): def setUp(self) -> None: self._config = deepcopy(_CONFIG) self._service_config = deepcopy(_SERVICE_CONFIG) + BatchSizeManager.reset() @staticmethod def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: @@ -151,11 +153,12 @@ def get_sheet_first_row( @staticmethod def get_stream_data( http_mocker: HttpMocker, - data_response_file: str, - response_code: int = 200, + data_response_file: Optional[str] = None, + response_code: Optional[int] = 200, stream_name: Optional[str] = _STREAM_NAME, request_range: Tuple = (2, 202), spreadsheet_id: Optional[str] = _SPREADSHEET_ID, + responses: Optional[Union[HttpResponse, List[HttpResponse]]] = None, ): """ " Mock requests to 'https://sheets.googleapis.com/v4/spreadsheets//values:batchGet?ranges=!2:202&majorDimension=ROWS&alt=json' @@ -188,5 +191,5 @@ def get_stream_data( .with_major_dimension("ROWS") .with_alt("json") .build(), - HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code), + HttpResponse(json.dumps(find_template(data_response_file, __file__)), response_code) if data_response_file else responses, ) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 5e789756c7026..4cad15deaf2ef 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -167,7 +167,7 @@ def test_read_429_error(self, http_mocker: HttpMocker) -> None: with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = f"Exception while syncing stream {_STREAM_NAME}: {exception_description_by_status_code(status_codes.TOO_MANY_REQUESTS, _STREAM_NAME)}" + expected_message = f"{exception_description_by_status_code(status_codes.TOO_MANY_REQUESTS, _STREAM_NAME)}" assert output.errors[0].trace.error.internal_message == expected_message @@ -212,5 +212,5 @@ def test_read_500_error(self, http_mocker: HttpMocker) -> None: with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = f"Exception while syncing stream a_stream_name: {exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID)}" + expected_message = f"{exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID)}" assert output.errors[0].trace.error.internal_message == expected_message diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 4dea1d31f6db7..ed4ab3b03863d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -480,6 +480,42 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) > 0 + @HttpMocker() + def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: HttpMocker) -> None: + test_file_base_name = "read_by_batches" + initial_batch_size = 10 + incremental_batch_size = initial_batch_size + GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}_2") + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name="d_stream_name") + start_range = 2 + too_many_response_increase = 100 + for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): + end_range = start_range + incremental_batch_size + request_range = (start_range, end_range) + mocked_responses = [ + HttpResponse(json.dumps(find_template("rate_limit_error", __file__)), + status_codes.TOO_MANY_REQUESTS), + HttpResponse(json.dumps(find_template(f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", __file__)), status_codes.OK) + ] + GoogleSheetsBaseTest.get_stream_data( + http_mocker, request_range=request_range, responses=mocked_responses, stream_name="d_stream_name" + ) + # after every 429 response we increase by 100 the batch size + incremental_batch_size += too_many_response_increase + start_range = end_range + 1 + catalog_properties = {} + for expected_property in ["id", "name", "normalized_name"]: + catalog_properties[expected_property] = {"type": ["null", "string"]} + configured_catalog = ( + CatalogBuilder() + .with_stream(ConfiguredAirbyteStreamBuilder().with_name("d_stream_name").with_json_schema({"properties": catalog_properties})) + .build() + ) + self._config["batch_size"] = initial_batch_size + output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) + assert len(output.records) > 0 + + @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row_2.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row_2.json new file mode 100644 index 0000000000000..3e6b245644cfc --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_sheet_first_row_2.json @@ -0,0 +1,313 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "properties": { + "title": "a_spreadsheet_id_4", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "d_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 1000, + "columnCount": 4 + } + }, + "data": [ + { + "rowData": [ + { + "values": [ + { + "userEnteredValue": { + "stringValue": "id" + }, + "effectiveValue": { + "stringValue": "id" + }, + "formattedValue": "id", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "name" + }, + "effectiveValue": { + "stringValue": "name" + }, + "formattedValue": "name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + }, + { + "userEnteredValue": { + "stringValue": "normalized_name" + }, + "effectiveValue": { + "stringValue": "normalized_name" + }, + "formattedValue": "normalized_name", + "effectiveFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "horizontalAlignment": "LEFT", + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "Arial", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "hyperlinkDisplayType": "PLAIN_TEXT", + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + } + } + ] + } + ], + "rowMetadata": [ + { + "pixelSize": 21 + } + ], + "columnMetadata": [ + { + "pixelSize": 100 + }, + { + "pixelSize": 100 + }, + { + "pixelSize": 113 + }, + { + "pixelSize": 100 + } + ] + } + ] + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA/edit?ouid=106175843115957165976" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info_2.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info_2.json new file mode 100644 index 0000000000000..59830753f3e95 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/resource/http/response/read_by_batches_get_spreadsheet_info_2.json @@ -0,0 +1,149 @@ +{ + "spreadsheetId": "1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA", + "properties": { + "title": "a_spreadsheet_id_4", + "locale": "en_US", + "autoRecalc": "ON_CHANGE", + "timeZone": "America/Mexico_City", + "defaultFormat": { + "backgroundColor": { + "red": 1, + "green": 1, + "blue": 1 + }, + "padding": { + "top": 2, + "right": 3, + "bottom": 2, + "left": 3 + }, + "verticalAlignment": "BOTTOM", + "wrapStrategy": "OVERFLOW_CELL", + "textFormat": { + "foregroundColor": {}, + "fontFamily": "arial,sans,sans-serif", + "fontSize": 10, + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "foregroundColorStyle": { + "rgbColor": {} + } + }, + "backgroundColorStyle": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + "spreadsheetTheme": { + "primaryFontFamily": "Arial", + "themeColors": [ + { + "colorType": "TEXT", + "color": { + "rgbColor": {} + } + }, + { + "colorType": "BACKGROUND", + "color": { + "rgbColor": { + "red": 1, + "green": 1, + "blue": 1 + } + } + }, + { + "colorType": "ACCENT1", + "color": { + "rgbColor": { + "red": 0.25882354, + "green": 0.52156866, + "blue": 0.95686275 + } + } + }, + { + "colorType": "ACCENT2", + "color": { + "rgbColor": { + "red": 0.91764706, + "green": 0.2627451, + "blue": 0.20784314 + } + } + }, + { + "colorType": "ACCENT3", + "color": { + "rgbColor": { + "red": 0.9843137, + "green": 0.7372549, + "blue": 0.015686275 + } + } + }, + { + "colorType": "ACCENT4", + "color": { + "rgbColor": { + "red": 0.20392157, + "green": 0.65882355, + "blue": 0.3254902 + } + } + }, + { + "colorType": "ACCENT5", + "color": { + "rgbColor": { + "red": 1, + "green": 0.42745098, + "blue": 0.003921569 + } + } + }, + { + "colorType": "ACCENT6", + "color": { + "rgbColor": { + "red": 0.27450982, + "green": 0.7411765, + "blue": 0.7764706 + } + } + }, + { + "colorType": "LINK", + "color": { + "rgbColor": { + "red": 0.06666667, + "green": 0.33333334, + "blue": 0.8 + } + } + } + ] + } + }, + "sheets": [ + { + "properties": { + "sheetId": 0, + "title": "d_stream_name", + "index": 0, + "sheetType": "GRID", + "gridProperties": { + "rowCount": 1000, + "columnCount": 4 + } + } + } + ], + "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1mSXqVEPNX-Bx-9l6LpDmO2iSEfVAzxwKs6yB8QK0OlA/edit?ouid=106175843115957165976" +} From 6ff32444a4403c1c576aa5bde09c8b5366f6a791 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Sun, 5 Jan 2025 21:36:59 -0800 Subject: [PATCH 26/63] source-google-sheets: ruff-format --- .../source_google_sheets/batch_size_manager.py | 2 ++ .../components/error_handlers.py | 9 ++++----- .../components/partition_routers.py | 2 +- .../source_google_sheets/components/retrievers.py | 3 +-- .../source_google_sheets/manifest.yaml | 4 +--- .../integration/google_sheets_base_test.py | 5 +++-- .../unit_tests/integration/test_source.py | 12 +++++++----- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py index 478fef2e7d6cc..f072f6b12d15e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py @@ -4,8 +4,10 @@ import logging + logger = logging.getLogger("airbyte") + class BatchSizeManager: _instance = None diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py index 605c55ac82127..09dad764d2229 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py @@ -4,21 +4,20 @@ from dataclasses import dataclass from typing import Optional, Union -from requests.status_codes import codes as status_codes import requests +from requests.status_codes import codes as status_codes +from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler from airbyte_cdk.sources.streams.http.error_handlers.response_models import ( ErrorResolution, ) -from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler from source_google_sheets.batch_size_manager import BatchSizeManager + @dataclass class SheetDataErrorHandler(DefaultErrorHandler): - def interpret_response( - self, response_or_exception: Optional[Union[requests.Response, Exception]] - ) -> ErrorResolution: + def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> ErrorResolution: if response_or_exception.status_code == status_codes.TOO_MANY_REQUESTS: batch_size_manager = BatchSizeManager() batch_size_manager.update_batch_size(batch_size_manager.get_batch_size() + 100) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index b869d9c5f4b32..37ed40d6abbb2 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -3,9 +3,9 @@ # from typing import Any, Iterable, Mapping -from source_google_sheets.batch_size_manager import BatchSizeManager from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter from airbyte_cdk.sources.types import StreamSlice +from source_google_sheets.batch_size_manager import BatchSizeManager class RangePartitionRouter(SinglePartitionRouter): diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py index 5001400f74446..be08959fcbec1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -14,6 +14,5 @@ class SheetsDataRetriever(SimpleRetriever): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self.stream_slicer: StreamSlicer = RangePartitionRouter( - parameters={"batch_size":self.config.get("batch_size", 200), "row_count": parameters.get("row_count", 0) } + parameters={"batch_size": self.config.get("batch_size", 200), "row_count": parameters.get("row_count", 0)} ) - diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index e878415e11b24..3a3e998429374 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -368,9 +368,7 @@ schemas: - string - "null" - - concurrency_level: type: ConcurrencyLevel default_concurrency: 1 - max_concurrency: 1 \ No newline at end of file + max_concurrency: 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index 65a28b82fdadb..77cbb14b90035 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -4,9 +4,11 @@ import json from abc import ABC from copy import deepcopy -from typing import Any, Dict, Optional, Tuple, Union, List +from typing import Any, Dict, List, Optional, Tuple, Union from unittest import TestCase +from source_google_sheets.batch_size_manager import BatchSizeManager + from airbyte_cdk.models import ( ConfiguredAirbyteCatalog, ) @@ -14,7 +16,6 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from source_google_sheets.batch_size_manager import BatchSizeManager from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials from .protocol_helpers import check_helper, discover_helper, read_helper from .request_builder import AuthBuilder, RequestBuilder diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index ed4ab3b03863d..b9a6d48a3e717 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -486,16 +486,19 @@ def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: Http initial_batch_size = 10 incremental_batch_size = initial_batch_size GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}_2") - GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name="d_stream_name") + GoogleSheetsBaseTest.get_sheet_first_row( + http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name="d_stream_name" + ) start_range = 2 too_many_response_increase = 100 for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): end_range = start_range + incremental_batch_size request_range = (start_range, end_range) mocked_responses = [ - HttpResponse(json.dumps(find_template("rate_limit_error", __file__)), - status_codes.TOO_MANY_REQUESTS), - HttpResponse(json.dumps(find_template(f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", __file__)), status_codes.OK) + HttpResponse(json.dumps(find_template("rate_limit_error", __file__)), status_codes.TOO_MANY_REQUESTS), + HttpResponse( + json.dumps(find_template(f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", __file__)), status_codes.OK + ), ] GoogleSheetsBaseTest.get_stream_data( http_mocker, request_range=request_range, responses=mocked_responses, stream_name="d_stream_name" @@ -515,7 +518,6 @@ def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: Http output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) > 0 - @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' From e625be60ee7bc23e29f5e9fecfad69f78763a256 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 6 Jan 2025 09:33:30 -0800 Subject: [PATCH 27/63] source-google-sheets: minor changes to batch size manager to handle too many requests --- .../source_google_sheets/batch_size_manager.py | 15 ++++++++++----- .../components/error_handlers.py | 5 +---- .../components/partition_routers.py | 3 +++ .../unit_tests/integration/test_source.py | 7 ++++--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py index f072f6b12d15e..9234d888ed606 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py @@ -3,26 +3,31 @@ # import logging +from typing import Optional, Union +import requests +from requests.status_codes import codes as status_codes logger = logging.getLogger("airbyte") class BatchSizeManager: _instance = None + RATE_LIMIT_INCREASE = 100 def __new__(cls, initial_batch_size=200): if cls._instance is None: cls._instance = super().__new__(cls) - cls._instance.batch_size = initial_batch_size + cls._instance.row_batch_size = initial_batch_size return cls._instance def get_batch_size(self) -> int: - return self._instance.batch_size + return self._instance.row_batch_size - def update_batch_size(self, new_batch_size: int) -> None: - self._instance.batch_size = new_batch_size - logger.info(f"Increasing number of records fetching due to rate limits. Current value: {self._instance.batch_size}") + def increase_row_batch_size(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> None: + if response_or_exception.status_code == status_codes.TOO_MANY_REQUESTS and self._instance.row_batch_size < 1000: + self._instance.row_batch_size += BatchSizeManager.RATE_LIMIT_INCREASE + logger.info(f"Increasing number of records fetching due to rate limits. Current value: {self._instance.row_batch_size}") @classmethod def reset(cls): diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py index 09dad764d2229..a7b3b2659db60 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py @@ -6,7 +6,6 @@ from typing import Optional, Union import requests -from requests.status_codes import codes as status_codes from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler from airbyte_cdk.sources.streams.http.error_handlers.response_models import ( @@ -18,7 +17,5 @@ @dataclass class SheetDataErrorHandler(DefaultErrorHandler): def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> ErrorResolution: - if response_or_exception.status_code == status_codes.TOO_MANY_REQUESTS: - batch_size_manager = BatchSizeManager() - batch_size_manager.update_batch_size(batch_size_manager.get_batch_size() + 100) + BatchSizeManager().increase_row_batch_size(response_or_exception) return super().interpret_response(response_or_exception) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 37ed40d6abbb2..22db13554daee 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -1,12 +1,14 @@ # # Copyright (c) 2024 Airbyte, Inc., all rights reserved. # +import logging from typing import Any, Iterable, Mapping from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter from airbyte_cdk.sources.types import StreamSlice from source_google_sheets.batch_size_manager import BatchSizeManager +logger = logging.getLogger("airbyte") class RangePartitionRouter(SinglePartitionRouter): """ @@ -25,5 +27,6 @@ def stream_slices(self) -> Iterable[StreamSlice]: start_range = 2 while start_range <= self.sheet_row_count: end_range = start_range + self.batch_size_manager.get_batch_size() + logger.info(f"Fetching start_range: {start_range}, end_range: {end_range}") yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) start_range = end_range + 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index b9a6d48a3e717..0ededd59ed28f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -483,11 +483,12 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock @HttpMocker() def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: HttpMocker) -> None: test_file_base_name = "read_by_batches" + stream_name = "d_stream_name" initial_batch_size = 10 incremental_batch_size = initial_batch_size GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}_2") GoogleSheetsBaseTest.get_sheet_first_row( - http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name="d_stream_name" + http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name=stream_name ) start_range = 2 too_many_response_increase = 100 @@ -501,7 +502,7 @@ def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: Http ), ] GoogleSheetsBaseTest.get_stream_data( - http_mocker, request_range=request_range, responses=mocked_responses, stream_name="d_stream_name" + http_mocker, request_range=request_range, responses=mocked_responses, stream_name=stream_name ) # after every 429 response we increase by 100 the batch size incremental_batch_size += too_many_response_increase @@ -511,7 +512,7 @@ def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: Http catalog_properties[expected_property] = {"type": ["null", "string"]} configured_catalog = ( CatalogBuilder() - .with_stream(ConfiguredAirbyteStreamBuilder().with_name("d_stream_name").with_json_schema({"properties": catalog_properties})) + .with_stream(ConfiguredAirbyteStreamBuilder().with_name(stream_name).with_json_schema({"properties": catalog_properties})) .build() ) self._config["batch_size"] = initial_batch_size From 6b487ea147d7cbd1631f4e5df4eb22bf9d869a12 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 6 Jan 2025 09:35:14 -0800 Subject: [PATCH 28/63] source-google-sheets: ruff-format --- .../source_google_sheets/batch_size_manager.py | 1 + .../source_google_sheets/components/partition_routers.py | 2 ++ .../unit_tests/integration/test_source.py | 4 +--- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py index 9234d888ed606..fa9d97ba57920 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py @@ -8,6 +8,7 @@ import requests from requests.status_codes import codes as status_codes + logger = logging.getLogger("airbyte") diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 22db13554daee..8318cd8228dec 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -8,8 +8,10 @@ from airbyte_cdk.sources.types import StreamSlice from source_google_sheets.batch_size_manager import BatchSizeManager + logger = logging.getLogger("airbyte") + class RangePartitionRouter(SinglePartitionRouter): """ Create ranges to request rows data to google sheets api. diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 0ededd59ed28f..59fa93137beb9 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -487,9 +487,7 @@ def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: Http initial_batch_size = 10 incremental_batch_size = initial_batch_size GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}_2") - GoogleSheetsBaseTest.get_sheet_first_row( - http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name=stream_name - ) + GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name=stream_name) start_range = 2 too_many_response_increase = 100 for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): From fc59b0d2ee85e1c22d870054bb4ef6ac1f026493 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 6 Jan 2025 13:52:10 -0800 Subject: [PATCH 29/63] source-google-sheets: add sheet id to range logging and remove old files --- .../source_google_sheets/client.py | 49 --- .../components/partition_routers.py | 5 +- .../components/retrievers.py | 2 +- .../source_google_sheets/helpers.py | 234 ------------- .../source_google_sheets/manifest.yaml | 9 +- .../source_google_sheets/source_.py | 279 --------------- .../unit_tests/test_client.py | 68 ---- .../unit_tests/test_helpers.py | 327 ------------------ 8 files changed, 12 insertions(+), 961 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/client.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_client.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_helpers.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/client.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/client.py deleted file mode 100644 index 1664da763bd02..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/client.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -import logging -from typing import Dict, List - -import backoff -from googleapiclient import errors -from requests import codes as status_codes - -from .helpers import SCOPES, Helpers - - -logger = logging.getLogger("airbyte") - - -class GoogleSheetsClient: - class Backoff: - row_batch_size = 200 - - @classmethod - def increase_row_batch_size(cls, details): - if details["exception"].status_code == status_codes.TOO_MANY_REQUESTS and cls.row_batch_size < 1000: - cls.row_batch_size = cls.row_batch_size + 100 - logger.info(f"Increasing number of records fetching due to rate limits. Current value: {cls.row_batch_size}") - - @staticmethod - def give_up(error): - code = error.resp.status - # Stop retrying if it's not a problem with the rate limit or on the server end - return not (code == status_codes.TOO_MANY_REQUESTS or 500 <= code < 600) - - def __init__(self, credentials: Dict[str, str], scopes: List[str] = SCOPES): - self.client = Helpers.get_authenticated_sheets_client(credentials, scopes) - - @backoff.on_exception(backoff.expo, errors.HttpError, max_time=120, giveup=Backoff.give_up, on_backoff=Backoff.increase_row_batch_size) - def get(self, **kwargs): - return self.client.get(**kwargs).execute() - - @backoff.on_exception(backoff.expo, errors.HttpError, max_time=120, giveup=Backoff.give_up, on_backoff=Backoff.increase_row_batch_size) - def get_values(self, **kwargs): - range = self._create_range(kwargs.pop("sheet"), kwargs.pop("row_cursor")) - logger.info(f"Fetching range {range}") - return self.client.values().batchGet(ranges=range, **kwargs).execute() - - def _create_range(self, sheet, row_cursor): - range = f"{sheet}!{row_cursor}:{row_cursor + self.Backoff.row_batch_size}" - return range diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 8318cd8228dec..3d72a3e53b739 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -23,12 +23,13 @@ def __init__(self, parameters: Mapping[str, Any]) -> None: super().__init__(parameters) self.parameters = parameters self.sheet_row_count = parameters.get("row_count", 0) - self.batch_size_manager = BatchSizeManager(parameters.get("batch_size", 200)) + self._sheet_id = parameters.get("sheet_id") + self.batch_size_manager = BatchSizeManager(parameters.get("batch_size")) def stream_slices(self) -> Iterable[StreamSlice]: start_range = 2 while start_range <= self.sheet_row_count: end_range = start_range + self.batch_size_manager.get_batch_size() - logger.info(f"Fetching start_range: {start_range}, end_range: {end_range}") + logger.info(f"Fetching range {self._sheet_id}!{start_range}:{end_range}") yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) start_range = end_range + 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py index be08959fcbec1..38370ced43d41 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -14,5 +14,5 @@ class SheetsDataRetriever(SimpleRetriever): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) self.stream_slicer: StreamSlicer = RangePartitionRouter( - parameters={"batch_size": self.config.get("batch_size", 200), "row_count": parameters.get("row_count", 0)} + parameters= {"batch_size": self.config.get("batch_size"), **parameters } ) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers.py deleted file mode 100644 index 74da7aef6182f..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/helpers.py +++ /dev/null @@ -1,234 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -import json -import logging -import re -from collections import defaultdict -from datetime import datetime -from typing import Dict, FrozenSet, Iterable, List, Tuple - -from google.oauth2 import credentials as client_account -from google.oauth2 import service_account -from googleapiclient import discovery - -from airbyte_cdk.models.airbyte_protocol import AirbyteRecordMessage, AirbyteStream, ConfiguredAirbyteCatalog, SyncMode - -from .models.spreadsheet import RowData, Spreadsheet -from .utils import safe_name_conversion - - -SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/drive.readonly"] - -logger = logging.getLogger("airbyte") - - -class Helpers(object): - @staticmethod - def get_authenticated_sheets_client(credentials: Dict[str, str], scopes: List[str] = SCOPES) -> discovery.Resource: - creds = Helpers.get_authenticated_google_credentials(credentials, scopes) - return discovery.build("sheets", "v4", credentials=creds).spreadsheets() - - @staticmethod - def get_authenticated_drive_client(credentials: Dict[str, str], scopes: List[str] = SCOPES) -> discovery.Resource: - creds = Helpers.get_authenticated_google_credentials(credentials, scopes) - return discovery.build("drive", "v3", credentials=creds) - - @staticmethod - def get_authenticated_google_credentials(credentials: Dict[str, str], scopes: List[str] = SCOPES): - auth_type = credentials.pop("auth_type") - if auth_type == "Service": - return service_account.Credentials.from_service_account_info(json.loads(credentials["service_account_info"]), scopes=scopes) - elif auth_type == "Client": - return client_account.Credentials.from_authorized_user_info(info=credentials) - - @staticmethod - def headers_to_airbyte_stream(logger: logging.Logger, sheet_name: str, header_row_values: List[str]) -> AirbyteStream: - """ - Parses sheet headers from the provided row. This method assumes that data is contiguous - i.e: every cell contains a value and the first cell which does not contain a value denotes the end - of the headers. For example, if the first row contains "One | Two | | Three" then this method - will parse the headers as ["One", "Two"]. This assumption is made for simplicity and can be modified later. - """ - fields, duplicate_fields = Helpers.get_valid_headers_and_duplicates(header_row_values) - if duplicate_fields: - logger.warn(f"Duplicate headers found in {sheet_name}. Ignoring them: {duplicate_fields}") - - sheet_json_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - # For simplicity, the type of every cell is a string - "properties": {field: {"type": "string"} for field in fields}, - } - - return AirbyteStream(name=sheet_name, json_schema=sheet_json_schema, supported_sync_modes=[SyncMode.full_refresh]) - - @staticmethod - def get_valid_headers_and_duplicates(header_row_values: List[str]) -> (List[str], List[str]): - fields = [] - duplicate_fields = set() - for cell_value in header_row_values: - if cell_value: - if cell_value in fields: - duplicate_fields.add(cell_value) - else: - fields.append(cell_value) - else: - break - - # Removing all duplicate fields - if duplicate_fields: - fields = [field for field in fields if field not in duplicate_fields] - - return fields, list(duplicate_fields) - - @staticmethod - def get_formatted_row_values(row_data: RowData) -> List[str]: - """ - Gets the formatted values of all cell data in this row. A formatted value is the final value a user sees in a spreadsheet. - It can be a raw string input by the user, or the result of a sheets function call. - """ - return [value.formattedValue for value in row_data.values] - - @staticmethod - def get_first_row(client, spreadsheet_id: str, sheet_name: str) -> List[str]: - spreadsheet = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=True, ranges=f"{sheet_name}!1:1")) - - # There is only one sheet since we are specifying the sheet in the requested ranges. - returned_sheets = spreadsheet.sheets - if len(returned_sheets) != 1: - raise Exception(f"Unexpected return result: Sheet {sheet_name} was expected to contain data on exactly 1 sheet. ") - - range_data = returned_sheets[0].data - if len(range_data) != 1: - raise Exception(f"Expected data for exactly one range for sheet {sheet_name}") - - all_row_data = range_data[0].rowData - if not all_row_data: - # the sheet is empty - logger.warning(f"The sheet {sheet_name} (ID {spreadsheet_id}) is empty!") - return [] - - if len(all_row_data) != 1: - raise Exception(f"Expected data for exactly one row for sheet {sheet_name}") - - first_row_data = all_row_data[0] - - return Helpers.get_formatted_row_values(first_row_data) - - @staticmethod - def parse_sheet_and_column_names_from_catalog(catalog: ConfiguredAirbyteCatalog) -> Dict[str, FrozenSet[str]]: - sheet_to_column_name = {} - for configured_stream in catalog.streams: - stream = configured_stream.stream - sheet_name = stream.name - sheet_to_column_name[sheet_name] = frozenset(stream.json_schema["properties"].keys()) - - return sheet_to_column_name - - @staticmethod - def row_data_to_record_message(sheet_name: str, cell_values: List[str], column_index_to_name: Dict[int, str]) -> AirbyteRecordMessage: - data = {} - for relevant_index in sorted(column_index_to_name.keys()): - if relevant_index >= len(cell_values): - break - - cell_value = cell_values[relevant_index] - if cell_value.strip() != "": - data[column_index_to_name[relevant_index]] = cell_value - - return AirbyteRecordMessage(stream=sheet_name, data=data, emitted_at=int(datetime.now().timestamp()) * 1000) - - @staticmethod - def get_available_sheets_to_column_index_to_name( - client, spreadsheet_id: str, requested_sheets_and_columns: Dict[str, FrozenSet[str]], names_conversion: bool = False - ) -> Dict[str, Dict[int, str]]: - available_sheets = Helpers.get_sheets_in_spreadsheet(client, spreadsheet_id) - logger.info(f"Available sheets: {available_sheets}") - available_sheets_to_column_index_to_name = defaultdict(dict) - for sheet, columns in requested_sheets_and_columns.items(): - if sheet in available_sheets: - first_row = Helpers.get_first_row(client, spreadsheet_id, sheet) - if names_conversion: - first_row = [safe_name_conversion(h) for h in first_row] - # When performing names conversion, they won't match what is listed in catalog for the majority of cases, - # so they should be cast here in order to have them in records - columns = {safe_name_conversion(c) for c in columns} - # Find the column index of each header value - idx = 0 - for cell_value in first_row: - if cell_value in columns: - available_sheets_to_column_index_to_name[sheet][idx] = cell_value - idx += 1 - return available_sheets_to_column_index_to_name - - @staticmethod - def get_sheets_in_spreadsheet(client, spreadsheet_id: str) -> List[str]: - spreadsheet_metadata = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=False)) - return [sheet.properties.title for sheet in spreadsheet_metadata.sheets] - - @staticmethod - def get_sheet_row_count(client, spreadsheet_id: str) -> Dict[str, int]: - spreadsheet_metadata = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=False)) - # filter out sheets without gridProperties (like in diagram sheets) - data_sheets = [sheet for sheet in spreadsheet_metadata.sheets if hasattr(sheet.properties, "gridProperties")] - return {sheet.properties.title: sheet.properties.gridProperties["rowCount"] for sheet in data_sheets} - - @staticmethod - def get_grid_sheets(spreadsheet_metadata) -> List[str]: - """Return grid only diagram, filter out sheets with image/diagram only - - https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#sheetproperties - """ - grid_sheets = [] - non_grid_sheets = [] - for sheet in spreadsheet_metadata.sheets: - sheet_title = sheet.properties.title - if ( - hasattr(sheet.properties, "gridProperties") - and hasattr(sheet.properties, "sheetType") - and sheet.properties.sheetType == "GRID" - ): - grid_sheets.append(sheet_title) - else: - non_grid_sheets.append(sheet_title) - - if non_grid_sheets: - # logging.getLogger(...).log() expects an integer level. The level for WARN is 30 - # Reference: https://docs.python.org/3.10/library/logging.html#levels - logging.getLogger("airbyte").log(30, "Skip non-grid sheets: " + ", ".join(non_grid_sheets)) - - return grid_sheets - - @staticmethod - def is_row_empty(cell_values: List[str]) -> bool: - for cell in cell_values: - if cell.strip() != "": - return False - return True - - @staticmethod - def row_contains_relevant_data(cell_values: List[str], relevant_indices: Iterable[int]) -> bool: - for idx in relevant_indices: - if len(cell_values) > idx and cell_values[idx].strip() != "": - return True - return False - - @staticmethod - def get_spreadsheet_id(id_or_url: str) -> str: - if re.match(r"(https://)", id_or_url): - # This is a URL - m = re.search(r"(/)([-\w]{20,})([/]?)", id_or_url) - if m is not None and m.group(2): - return m.group(2) - else: - return id_or_url - - @staticmethod - def check_sheet_is_valid(client, spreadsheet_id: str, sheet_name: str) -> Tuple[bool, str]: - try: - Helpers.get_first_row(client, spreadsheet_id, sheet_name) - return True, "" - except Exception as e: - return False, str(e) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 3a3e998429374..f02f174b30f04 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -17,6 +17,7 @@ dynamic_streams: class_name: "source_google_sheets.components.SheetsDataRetriever" $parameters: row_count: 0 + sheet_id: "" paginator: type: NoPagination record_selector: @@ -129,7 +130,13 @@ dynamic_streams: - row_count type: ComponentMappingDefinition value: "{{components_values['properties']['gridProperties']['rowCount']}}" - description: rows count for dynamic stream partition router (slicer). + - field_path: + - retriever + - $parameters + - sheet_id + type: ComponentMappingDefinition + value: "{{components_values['properties']['title']}}" + description: sheet_id for retriever. - field_path: - retriever - partition_router diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py deleted file mode 100644 index 06ba0e617d123..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source_.py +++ /dev/null @@ -1,279 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - - -import json -import logging -import socket -from typing import Any, Generator, List, Mapping, MutableMapping, Optional, Union - -from apiclient import errors -from google.auth import exceptions as google_exceptions -from requests.status_codes import codes as status_codes - -from airbyte_cdk.models import FailureType -from airbyte_cdk.models.airbyte_protocol import ( - AirbyteCatalog, - AirbyteConnectionStatus, - AirbyteMessage, - AirbyteStateMessage, - AirbyteStreamStatus, - ConfiguredAirbyteCatalog, - Status, - Type, -) -from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager -from airbyte_cdk.sources.source import Source -from airbyte_cdk.sources.streams.checkpoint import FullRefreshCheckpointReader -from airbyte_cdk.utils import AirbyteTracedException -from airbyte_cdk.utils.stream_status_utils import as_airbyte_message - -from .client import GoogleSheetsClient -from .helpers import Helpers -from .models.spreadsheet import Spreadsheet -from .models.spreadsheet_values import SpreadsheetValues -from .utils import exception_description_by_status_code, safe_name_conversion - - -# override default socket timeout to be 10 mins instead of 60 sec. -# on behalf of https://github.com/airbytehq/oncall/issues/242 -DEFAULT_SOCKET_TIMEOUT: int = 600 -socket.setdefaulttimeout(DEFAULT_SOCKET_TIMEOUT) - - -class SourceGoogleSheets(Source): - """ - Spreadsheets API Reference: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets - """ - - def check(self, logger: logging.Logger, config: json) -> AirbyteConnectionStatus: - # Check involves verifying that the specified spreadsheet is reachable with our credentials. - try: - client = GoogleSheetsClient(self.get_credentials(config)) - except Exception as e: - return AirbyteConnectionStatus(status=Status.FAILED, message=f"Please use valid credentials json file. Error: {e}") - - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - - try: - spreadsheet = client.get(spreadsheetId=spreadsheet_id, includeGridData=False) - except errors.HttpError as err: - message = "Config error: " - # Give a clearer message if it's a common error like 404. - if err.resp.status == status_codes.NOT_FOUND: - message += "The spreadsheet link is not valid. Enter the URL of the Google spreadsheet you want to sync." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - except google_exceptions.GoogleAuthError as err: - message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - - # Check for duplicate headers - spreadsheet_metadata = Spreadsheet.parse_obj(spreadsheet) - grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) - - duplicate_headers_in_sheet = {} - for sheet_name in grid_sheets: - try: - header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) - if config.get("names_conversion"): - header_row_data = [safe_name_conversion(h) for h in header_row_data] - _, duplicate_headers = Helpers.get_valid_headers_and_duplicates(header_row_data) - if duplicate_headers: - duplicate_headers_in_sheet[sheet_name] = duplicate_headers - except Exception as err: - if str(err).startswith("Expected data for exactly one row for sheet"): - logger.warn(f"Skip empty sheet: {sheet_name}") - else: - logger.error(str(err)) - return AirbyteConnectionStatus( - status=Status.FAILED, message=f"Unable to read the schema of sheet {sheet_name}. Error: {str(err)}" - ) - if duplicate_headers_in_sheet: - duplicate_headers_error_message = ", ".join( - [ - f"[sheet:{sheet_name}, headers:{duplicate_sheet_headers}]" - for sheet_name, duplicate_sheet_headers in duplicate_headers_in_sheet.items() - ] - ) - return AirbyteConnectionStatus( - status=Status.FAILED, - message="The following duplicate headers were found in the following sheets. Please fix them to continue: " - + duplicate_headers_error_message, - ) - - return AirbyteConnectionStatus(status=Status.SUCCEEDED) - - def discover(self, logger: logging.Logger, config: json) -> AirbyteCatalog: - client = GoogleSheetsClient(self.get_credentials(config)) - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - try: - logger.info(f"Running discovery on sheet {spreadsheet_id}") - spreadsheet_metadata = Spreadsheet.parse_obj(client.get(spreadsheetId=spreadsheet_id, includeGridData=False)) - grid_sheets = Helpers.get_grid_sheets(spreadsheet_metadata) - streams = [] - for sheet_name in grid_sheets: - try: - header_row_data = Helpers.get_first_row(client, spreadsheet_id, sheet_name) - if config.get("names_conversion"): - header_row_data = [safe_name_conversion(h) for h in header_row_data] - stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_row_data) - streams.append(stream) - except Exception as err: - if str(err).startswith("Expected data for exactly one row for sheet"): - logger.warn(f"Skip empty sheet: {sheet_name}") - else: - logger.error(str(err)) - return AirbyteCatalog(streams=streams) - - except errors.HttpError as err: - error_description = exception_description_by_status_code(err.resp.status, spreadsheet_id) - config_error_status_codes = [status_codes.NOT_FOUND, status_codes.FORBIDDEN] - if err.resp.status in config_error_status_codes: - message = f"{error_description}. {err.reason}." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - raise Exception(f"Could not discover the schema of your spreadsheet. {error_description}. {err.reason}.") - except google_exceptions.GoogleAuthError as err: - message = "Access to the spreadsheet expired or was revoked. Re-authenticate to restore access." - raise AirbyteTracedException( - message=message, - internal_message=message, - failure_type=FailureType.config_error, - ) from err - - def _read( - self, - logger: logging.Logger, - config: json, - catalog: ConfiguredAirbyteCatalog, - state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, - ) -> Generator[AirbyteMessage, None, None]: - client = GoogleSheetsClient(self.get_credentials(config)) - client.Backoff.row_batch_size = config.get("batch_size", 200) - - sheet_to_column_name = Helpers.parse_sheet_and_column_names_from_catalog(catalog) - stream_instances = {s.stream.name: s.stream for s in catalog.streams} - state_manager = ConnectorStateManager(stream_instance_map=stream_instances, state=state or {}) - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - - logger.info(f"Starting syncing spreadsheet {spreadsheet_id}") - # For each sheet in the spreadsheet, get a batch of rows, and as long as there hasn't been - # a blank row, emit the row batch - sheet_to_column_index_to_name = Helpers.get_available_sheets_to_column_index_to_name( - client, spreadsheet_id, sheet_to_column_name, config.get("names_conversion") - ) - sheet_row_counts = Helpers.get_sheet_row_count(client, spreadsheet_id) - logger.info(f"Row counts: {sheet_row_counts}") - for sheet in sheet_to_column_index_to_name.keys(): - logger.info(f"Syncing sheet {sheet}") - stream = stream_instances.get(sheet) - yield as_airbyte_message(stream, AirbyteStreamStatus.STARTED) - checkpoint_reader = FullRefreshCheckpointReader([]) - _ = checkpoint_reader.next() - # We revalidate the sheet here to avoid errors in case the sheet was changed after the sync started - is_valid, reason = Helpers.check_sheet_is_valid(client, spreadsheet_id, sheet) - if not is_valid: - logger.info(f"Skipping syncing sheet {sheet}: {reason}") - yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) - yield as_airbyte_message(stream, AirbyteStreamStatus.INCOMPLETE) - continue - - column_index_to_name = sheet_to_column_index_to_name[sheet] - row_cursor = 2 # we start syncing past the header row - # For the loop, it is necessary that the initial row exists when we send a request to the API, - # if the last row of the interval goes outside the sheet - this is normal, we will return - # only the real data of the sheet and in the next iteration we will loop out. - while row_cursor <= sheet_row_counts[sheet]: - row_batch = SpreadsheetValues.parse_obj( - client.get_values( - sheet=sheet, - row_cursor=row_cursor, - spreadsheetId=spreadsheet_id, - majorDimension="ROWS", - ) - ) - - row_cursor += client.Backoff.row_batch_size + 1 - # there should always be one range since we requested only one - value_ranges = row_batch.valueRanges[0] - - if not value_ranges.values: - break - - row_values = value_ranges.values - if len(row_values) == 0: - break - - yield as_airbyte_message(stream, AirbyteStreamStatus.RUNNING) - for row in row_values: - if not Helpers.is_row_empty(row) and Helpers.row_contains_relevant_data(row, column_index_to_name.keys()): - yield AirbyteMessage(type=Type.RECORD, record=Helpers.row_data_to_record_message(sheet, row, column_index_to_name)) - - yield self._checkpoint_state(checkpoint_reader.get_checkpoint(), state_manager, sheet, None) - yield as_airbyte_message(stream, AirbyteStreamStatus.COMPLETE) - - def _checkpoint_state( - self, - stream_state: Mapping[str, Any], - state_manager, - stream_name: str, - stream_namespace: Optional[str], - ) -> AirbyteMessage: - state_manager.update_state_for_stream(stream_name, stream_namespace, stream_state) - return state_manager.create_state_message(stream_name, stream_namespace) - - def read( - self, - logger: logging.Logger, - config: json, - catalog: ConfiguredAirbyteCatalog, - state: Union[List[AirbyteStateMessage], MutableMapping[str, Any]] = None, - ) -> Generator[AirbyteMessage, None, None]: - spreadsheet_id = Helpers.get_spreadsheet_id(config["spreadsheet_id"]) - try: - yield from self._read(logger, config, catalog, state) - except errors.HttpError as e: - error_description = exception_description_by_status_code(e.status_code, spreadsheet_id) - - if e.status_code == status_codes.FORBIDDEN: - raise AirbyteTracedException( - message=f"Stopped syncing process. {error_description}", - internal_message=error_description, - failure_type=FailureType.config_error, - ) from e - if e.status_code == status_codes.TOO_MANY_REQUESTS: - raise AirbyteTracedException( - message=f"Stopped syncing process due to rate limits. {error_description}", - internal_message=error_description, - failure_type=FailureType.transient_error, - ) from e - else: - logger.info(f"{e.status_code}: {e.reason}. {error_description}") - raise AirbyteTracedException( - message=f"Stopped syncing process. {error_description}", - internal_message=error_description, - failure_type=FailureType.transient_error, - ) from e - finally: - logger.info(f"Finished syncing spreadsheet {spreadsheet_id}") - - @staticmethod - def get_credentials(config): - # backward compatible with old style config - if config.get("credentials_json"): - credentials = {"auth_type": "Service", "service_account_info": config.get("credentials_json")} - return credentials - - return config.get("credentials") diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_client.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_client.py deleted file mode 100644 index eb588ef1cd3c3..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_client.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# -from unittest.mock import MagicMock - -import pytest -import requests -from source_google_sheets.client import GoogleSheetsClient - - -@pytest.mark.parametrize("status, need_give_up", [(429, False), (500, False), (404, True)]) -def test_backoff_give_up(status, need_give_up, mocker): - e = requests.HTTPError("error") - e.resp = mocker.Mock(status=status) - assert need_give_up is GoogleSheetsClient.Backoff.give_up(e) - - -def test_backoff_increase_row_batch_size(): - client = GoogleSheetsClient( - {"auth_type": "Client", "client_id": "fake_client_id", "client_secret": "fake_client_secret", "refresh_token": "fake_refresh_token"} - ) - assert client.Backoff.row_batch_size == 200 - assert client._create_range("spreadsheet_id", 0) == "spreadsheet_id!0:200" - e = requests.HTTPError("error") - e.status_code = 429 - client.Backoff.increase_row_batch_size({"exception": e}) - assert client.Backoff.row_batch_size == 300 - assert client._create_range("spreadsheet_id", 0) == "spreadsheet_id!0:300" - client.Backoff.row_batch_size = 1000 - client.Backoff.increase_row_batch_size({"exception": e}) - assert client.Backoff.row_batch_size == 1000 - assert client._create_range("spreadsheet_id", 0) == "spreadsheet_id!0:1000" - - -def test_client_get_values_on_backoff(caplog): - client_google_sheets = GoogleSheetsClient( - { - "auth_type": "Client", - "client_id": "fake_client_id", - "client_secret": "fake_client_secret", - "refresh_token": "fake_refresh_token", - }, - ) - client_google_sheets.Backoff.row_batch_size = 210 - client_google_sheets.client.values = MagicMock(return_value=MagicMock(batchGet=MagicMock())) - - assert client_google_sheets.Backoff.row_batch_size == 210 - client_google_sheets.get_values( - sheet="sheet", - row_cursor=0, - spreadsheetId="spreadsheet_id", - majorDimension="ROWS", - ) - - assert "Fetching range sheet!0:210" in caplog.text - assert client_google_sheets.Backoff.row_batch_size == 210 - e = requests.HTTPError("error") - e.status_code = 429 - client_google_sheets.Backoff.increase_row_batch_size({"exception": e}) - assert client_google_sheets.Backoff.row_batch_size == 310 - client_google_sheets.get_values( - sheet="sheet", - row_cursor=0, - spreadsheetId="spreadsheet_id", - majorDimension="ROWS", - ) - - assert "Fetching range sheet!0:310" in caplog.text diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_helpers.py deleted file mode 100644 index a57d024c6d0c5..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_helpers.py +++ /dev/null @@ -1,327 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - - -import logging -import unittest -from unittest.mock import Mock, patch - -from source_google_sheets.client import GoogleSheetsClient -from source_google_sheets.helpers import Helpers -from source_google_sheets.models import CellData, GridData, RowData, Sheet, SheetProperties, Spreadsheet - -from airbyte_cdk.models.airbyte_protocol import ( - AirbyteRecordMessage, - AirbyteStream, - ConfiguredAirbyteCatalog, - ConfiguredAirbyteStream, - DestinationSyncMode, - SyncMode, -) - - -logger = logging.getLogger("airbyte") - - -def google_sheet_client(row_data, spreadsheet_id, client): - fake_response = Spreadsheet( - spreadsheetId=spreadsheet_id, - sheets=[Sheet(data=[GridData(rowData=row_data)])], - ) - client.get.return_value.execute.return_value = fake_response - with patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes: None): - sheet_client = GoogleSheetsClient({"fake": "credentials"}, ["auth_scopes"]) - sheet_client.client = client - return sheet_client - - -def google_sheet_invalid_client(spreadsheet_id, client): - fake_response = Spreadsheet( - spreadsheetId=spreadsheet_id, - sheets=[Sheet(data=[])], - ) - client.get.return_value.execute.return_value = fake_response - with patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes: None): - sheet_client = GoogleSheetsClient({"fake": "credentials"}, ["auth_scopes"]) - sheet_client.client = client - return sheet_client - - -class TestHelpers(unittest.TestCase): - def test_headers_to_airbyte_stream(self): - sheet_name = "sheet1" - header_values = ["h1", "h2", "h3"] - - expected_stream = AirbyteStream( - name=sheet_name, - json_schema={ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - # For simplicity, the type of every cell is a string - "properties": {header: {"type": "string"} for header in header_values}, - }, - supported_sync_modes=[SyncMode.full_refresh], - ) - - actual_stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_values) - self.assertEqual(expected_stream, actual_stream) - - def test_duplicate_headers_retrieved(self): - header_values = ["h1", "h1", "h3"] - - expected_valid_header_values = ["h3"] - expected_duplicate_header_values = ["h1"] - - actual_header_values, actual_duplicate_header_values = Helpers.get_valid_headers_and_duplicates(header_values) - - self.assertEqual(expected_duplicate_header_values, actual_duplicate_header_values) - self.assertEqual(expected_valid_header_values, actual_header_values) - - def test_duplicate_headers_to_ab_stream_ignores_duplicates(self): - sheet_name = "sheet1" - header_values = ["h1", "h1", "h3"] - - # h1 is ignored because it is duplicate - expected_stream_header_values = ["h3"] - expected_stream = AirbyteStream( - name=sheet_name, - json_schema={ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - # For simplicity, the type of every cell is a string - "properties": {header: {"type": "string"} for header in expected_stream_header_values}, - }, - supported_sync_modes=[SyncMode.full_refresh], - ) - - actual_stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_values) - self.assertEqual(expected_stream, actual_stream) - - def test_headers_to_airbyte_stream_blank_values_terminate_row(self): - sheet_name = "sheet1" - header_values = ["h1", "", "h3"] - - expected_stream = AirbyteStream( - name=sheet_name, - json_schema={ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - # For simplicity, the type of every cell is a string - "properties": {"h1": {"type": "string"}}, - }, - supported_sync_modes=[SyncMode.full_refresh], - ) - actual_stream = Helpers.headers_to_airbyte_stream(logger, sheet_name, header_values) - - self.assertEqual(expected_stream, actual_stream) - - def test_is_row_empty_with_empty_row(self): - values = [" ", "", " "] - - self.assertTrue(Helpers.is_row_empty(values)) - - def test_is_row_empty_with_full_row(self): - values = [" ", "", " ", "somevaluehere"] - - self.assertFalse(Helpers.is_row_empty(values)) - - def test_row_contains_relevant_data(self): - values = ["c1", "c2", "c3"] - relevant_indices = [2] - self.assertTrue(Helpers.row_contains_relevant_data(values, relevant_indices)) - - def test_row_contains_relevant_data_is_false(self): - values = ["", "", "c3"] - relevant_indices = [0, 1] - self.assertFalse(Helpers.row_contains_relevant_data(values, relevant_indices)) - - def test_parse_sheet_and_column_names_from_catalog(self): - sheet1 = "soccer_team" - sheet1_columns = frozenset(["arsenal", "chelsea", "manutd", "liverpool"]) - sheet1_schema = {"properties": {c: {"type": "string"} for c in sheet1_columns}} - - sheet2 = "basketball_teams" - sheet2_columns = frozenset(["gsw", "lakers"]) - sheet2_schema = {"properties": {c: {"type": "string"} for c in sheet2_columns}} - - catalog = ConfiguredAirbyteCatalog( - streams=[ - ConfiguredAirbyteStream( - stream=AirbyteStream(name=sheet1, json_schema=sheet1_schema, supported_sync_modes=["full_refresh"]), - sync_mode=SyncMode.full_refresh, - destination_sync_mode=DestinationSyncMode.overwrite, - ), - ConfiguredAirbyteStream( - stream=AirbyteStream(name=sheet2, json_schema=sheet2_schema, supported_sync_modes=["full_refresh"]), - sync_mode=SyncMode.full_refresh, - destination_sync_mode=DestinationSyncMode.overwrite, - ), - ] - ) - - actual = Helpers.parse_sheet_and_column_names_from_catalog(catalog) - - expected = {sheet1: sheet1_columns, sheet2: sheet2_columns} - self.assertEqual(actual, expected) - - def test_row_data_to_record_message(self): - sheet = "my_sheet" - cell_values = ["v1", "v2", "v3", "v4"] - column_index_to_name = {0: "c1", 3: "c4"} - - actual = Helpers.row_data_to_record_message(sheet, cell_values, column_index_to_name) - - expected = AirbyteRecordMessage(stream=sheet, data={"c1": "v1", "c4": "v4"}, emitted_at=1) - self.assertEqual(expected.stream, actual.stream) - self.assertEqual(expected.data, actual.data) - - def test_get_formatted_row_values(self): - expected = [str(i) for i in range(10)] - row_data = RowData(values=[CellData(formattedValue=x) for x in expected]) - - actual = Helpers.get_formatted_row_values(row_data) - - self.assertEqual(expected, actual) - - def test_get_first_row(self): - spreadsheet_id = "123" - sheet = "s1" - expected_first_row = ["1", "2", "3", "4"] - row_data = [RowData(values=[CellData(formattedValue=v) for v in expected_first_row])] - client = Mock() - sheet_client = google_sheet_client(row_data, spreadsheet_id, client) - actual = Helpers.get_first_row(sheet_client, spreadsheet_id, sheet) - self.assertEqual(expected_first_row, actual) - client.get.assert_called_with(spreadsheetId=spreadsheet_id, includeGridData=True, ranges=f"{sheet}!1:1") - - def test_get_first_row_empty_sheet(self): - spreadsheet_id = "123" - sheet = "s1" - row_data = [] - client = Mock() - sheet_client = google_sheet_client(row_data, spreadsheet_id, client) - self.assertEqual(Helpers.get_first_row(sheet_client, spreadsheet_id, sheet), []) - client.get.assert_called_with(spreadsheetId=spreadsheet_id, includeGridData=True, ranges=f"{sheet}!1:1") - - def test_check_sheet_is_valid(self): - spreadsheet_id = "123" - sheet = "s1" - expected_first_row = ["1", "2", "3", "4"] - row_data = [RowData(values=[CellData(formattedValue=v) for v in expected_first_row])] - client = Mock() - sheet_client = google_sheet_client(row_data, spreadsheet_id, client) - is_valid, reason = Helpers.check_sheet_is_valid(sheet_client, spreadsheet_id, sheet) - self.assertTrue(is_valid) - self.assertEqual(reason, "") - - def test_check_sheet_is_valid_empty(self): - spreadsheet_id = "123" - sheet = "s1" - client = Mock() - sheet_client = google_sheet_invalid_client(spreadsheet_id, client) - is_valid, reason = Helpers.check_sheet_is_valid(sheet_client, spreadsheet_id, sheet) - self.assertFalse(is_valid) - self.assertEqual(reason, "Expected data for exactly one range for sheet s1") - - def test_get_sheets_in_spreadsheet(self): - spreadsheet_id = "id1" - expected_sheets = ["s1", "s2"] - client = Mock() - client.get.return_value.execute.return_value = Spreadsheet( - spreadsheetId=spreadsheet_id, sheets=[Sheet(properties=SheetProperties(title=t)) for t in expected_sheets] - ) - with patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes: None): - sheet_client = GoogleSheetsClient({"fake": "credentials"}, ["auth_scopes"]) - sheet_client.client = client - actual_sheets = Helpers.get_sheets_in_spreadsheet(sheet_client, spreadsheet_id) - - self.assertEqual(expected_sheets, actual_sheets) - client.get.assert_called_with(spreadsheetId=spreadsheet_id, includeGridData=False) - - def test_get_available_sheets_to_column_index_to_name(self): - # To mock different return values depending on input args, we use side effects with this method - spreadsheet_id = "123" - sheet1 = "s1" - sheet1_first_row = ["1", "2", "3", "4"] - - # Since pytest and unittest don't give a clean way to mock responses for exact input arguments, - # we use .side_effect to achieve this. This dict structure is spreadsheet_id -> includeGridData -> ranges - def mock_client_call(spreadsheetId, includeGridData, ranges=None): - if spreadsheetId != spreadsheet_id: - return None - # the spreadsheet only contains sheet1 - elif not includeGridData and ranges is None: - mocked_return = Spreadsheet(spreadsheetId=spreadsheet_id, sheets=[Sheet(properties=SheetProperties(title=sheet1))]) - elif includeGridData and ranges == f"{sheet1}!1:1": - mocked_return = Spreadsheet( - spreadsheetId=spreadsheet_id, - sheets=[Sheet(data=[GridData(rowData=[RowData(values=[CellData(formattedValue=v) for v in sheet1_first_row])])])], - ) - - m = Mock() - m.execute.return_value = mocked_return - return m - - client = Mock() - client.get.side_effect = mock_client_call - with patch.object(GoogleSheetsClient, "__init__", lambda s, credentials, scopes: None): - sheet_client = GoogleSheetsClient({"fake": "credentials"}, ["auth_scopes"]) - sheet_client.client = client - - expected = {sheet1: {0: "1", 1: "2", 2: "3", 3: "4"}} - - # names_conversion = False - actual = Helpers.get_available_sheets_to_column_index_to_name( - client=sheet_client, - spreadsheet_id=spreadsheet_id, - requested_sheets_and_columns={sheet1: frozenset(sheet1_first_row), "doesnotexist": frozenset(["1", "2"])}, - ) - self.assertEqual(expected, actual) - - # names_conversion = False, with null header cell - sheet1_first_row = ["1", "2", "3", "4", None] - expected = {sheet1: {0: "1", 1: "2", 2: "3", 3: "4", 4: None}} - actual = Helpers.get_available_sheets_to_column_index_to_name( - client=sheet_client, - spreadsheet_id=spreadsheet_id, - requested_sheets_and_columns={sheet1: frozenset(sheet1_first_row), "doesnotexist": frozenset(["1", "2"])}, - ) - self.assertEqual(expected, actual) - - # names_conversion = True, with null header cell - sheet1_first_row = ["AB", "Some Header", "Header", "4", "1MyName", None] - expected = {sheet1: {0: "ab", 1: "some_header", 2: "header", 3: "_4", 4: "_1_my_name", 5: None}} - actual = Helpers.get_available_sheets_to_column_index_to_name( - client=sheet_client, - spreadsheet_id=spreadsheet_id, - requested_sheets_and_columns={sheet1: frozenset(sheet1_first_row), "doesnotexist": frozenset(["1", "2"])}, - names_conversion=True, - ) - - self.assertEqual(expected, actual) - - def test_get_spreadsheet_id(self): - test_url = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q/edit#gid=1820065035" - result = Helpers.get_spreadsheet_id(test_url) - self.assertEqual("18vWlVH8BfjGegwY_GdV1B_cPP9re66xI8uJK25dtY9Q", result) - - test_url = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q/edit" - result = Helpers.get_spreadsheet_id(test_url) - self.assertEqual("18vWlVH8BfjGa-gwYGdV1BjcPP9re66xI8uJK25dtY9Q", result) - - test_url = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/" - result = Helpers.get_spreadsheet_id(test_url) - self.assertEqual("18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q", result) - - test_url = "https://docs.google.com/spreadsheets/d/18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q/#" - result = Helpers.get_spreadsheet_id(test_url) - self.assertEqual("18vWlVH8BfjGegwY_GdV1BjcPP9re_6xI8uJ-25dtY9Q", result) - - test_url = "18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q" - result = Helpers.get_spreadsheet_id(test_url) - self.assertEqual("18vWlVH8BfjGegwY_GdV1BjcPP9re66xI8uJK25dtY9Q", result) - - -if __name__ == "__main__": - unittest.main() From 1803ba89099228915be66da32adbf3b21fbe5fe8 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 6 Jan 2025 13:52:56 -0800 Subject: [PATCH 30/63] source-google-sheets: ruff-format --- .../source_google_sheets/components/retrievers.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py index 38370ced43d41..654b7683cb2cb 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -13,6 +13,4 @@ class SheetsDataRetriever(SimpleRetriever): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) - self.stream_slicer: StreamSlicer = RangePartitionRouter( - parameters= {"batch_size": self.config.get("batch_size"), **parameters } - ) + self.stream_slicer: StreamSlicer = RangePartitionRouter(parameters={"batch_size": self.config.get("batch_size"), **parameters}) From 1dc50a53a0794dab757964caebba3c07254b4afb Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 9 Jan 2025 07:49:19 -0800 Subject: [PATCH 31/63] source-google-sheets: Update lock file with latest CDK --- .../source-google-sheets/poetry.lock | 196 +++++++++--------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index 018ffc55a1a24..c5099456b77ac 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.12.4" +version = "6.16.0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.12.4-py3-none-any.whl", hash = "sha256:903f2c2d3be4d6595bc6c50a4625e2551308d2ca90e021bf489e0a82cf0f965d"}, - {file = "airbyte_cdk-6.12.4.tar.gz", hash = "sha256:f9f39746dec5e01a9d37255cfb45a753953227b7aafebf8f5603a6e9f943b182"}, + {file = "airbyte_cdk-6.16.0-py3-none-any.whl", hash = "sha256:ac25427322d7b348ef93c9083906d818aa7f05bbe3065d1d24826d166260cf87"}, + {file = "airbyte_cdk-6.16.0.tar.gz", hash = "sha256:0ddda444c6858fcd876a91d238ecef05a3598536a4ef51d2c485690085965463"}, ] [package.dependencies] @@ -74,13 +74,13 @@ files = [ [[package]] name = "anyio" -version = "4.7.0" +version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, - {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, ] [package.dependencies] @@ -91,7 +91,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -986,86 +986,86 @@ files = [ [[package]] name = "orjson" -version = "3.10.13" +version = "3.10.14" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.13-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1232c5e873a4d1638ef957c5564b4b0d6f2a6ab9e207a9b3de9de05a09d1d920"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26a0eca3035619fa366cbaf49af704c7cb1d4a0e6c79eced9f6a3f2437964b6"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4b6acd7c9c829895e50d385a357d4b8c3fafc19c5989da2bae11783b0fd4977"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1884e53c6818686891cc6fc5a3a2540f2f35e8c76eac8dc3b40480fb59660b00"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a428afb5720f12892f64920acd2eeb4d996595bf168a26dd9190115dbf1130d"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba5b13b8739ce5b630c65cb1c85aedbd257bcc2b9c256b06ab2605209af75a2e"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cab83e67f6aabda1b45882254b2598b48b80ecc112968fc6483fa6dae609e9f0"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:62c3cc00c7e776c71c6b7b9c48c5d2701d4c04e7d1d7cdee3572998ee6dc57cc"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dc03db4922e75bbc870b03fc49734cefbd50fe975e0878327d200022210b82d8"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22f1c9a30b43d14a041a6ea190d9eca8a6b80c4beb0e8b67602c82d30d6eec3e"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b42f56821c29e697c68d7d421410d7c1d8f064ae288b525af6a50cf99a4b1200"}, - {file = "orjson-3.10.13-cp310-cp310-win32.whl", hash = "sha256:0dbf3b97e52e093d7c3e93eb5eb5b31dc7535b33c2ad56872c83f0160f943487"}, - {file = "orjson-3.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:46c249b4e934453be4ff2e518cd1adcd90467da7391c7a79eaf2fbb79c51e8c7"}, - {file = "orjson-3.10.13-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a36c0d48d2f084c800763473020a12976996f1109e2fcb66cfea442fdf88047f"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0065896f85d9497990731dfd4a9991a45b0a524baec42ef0a63c34630ee26fd6"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92b4ec30d6025a9dcdfe0df77063cbce238c08d0404471ed7a79f309364a3d19"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a94542d12271c30044dadad1125ee060e7a2048b6c7034e432e116077e1d13d2"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3723e137772639af8adb68230f2aa4bcb27c48b3335b1b1e2d49328fed5e244c"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f00c7fb18843bad2ac42dc1ce6dd214a083c53f1e324a0fd1c8137c6436269b"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0e2759d3172300b2f892dee85500b22fca5ac49e0c42cfff101aaf9c12ac9617"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee948c6c01f6b337589c88f8e0bb11e78d32a15848b8b53d3f3b6fea48842c12"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa6fe68f0981fba0d4bf9cdc666d297a7cdba0f1b380dcd075a9a3dd5649a69e"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbcd7aad6bcff258f6896abfbc177d54d9b18149c4c561114f47ebfe74ae6bfd"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2149e2fcd084c3fd584881c7f9d7f9e5ad1e2e006609d8b80649655e0d52cd02"}, - {file = "orjson-3.10.13-cp311-cp311-win32.whl", hash = "sha256:89367767ed27b33c25c026696507c76e3d01958406f51d3a2239fe9e91959df2"}, - {file = "orjson-3.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:dca1d20f1af0daff511f6e26a27354a424f0b5cf00e04280279316df0f604a6f"}, - {file = "orjson-3.10.13-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a3614b00621c77f3f6487792238f9ed1dd8a42f2ec0e6540ee34c2d4e6db813a"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c976bad3996aa027cd3aef78aa57873f3c959b6c38719de9724b71bdc7bd14b"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f74d878d1efb97a930b8a9f9898890067707d683eb5c7e20730030ecb3fb930"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33ef84f7e9513fb13b3999c2a64b9ca9c8143f3da9722fbf9c9ce51ce0d8076e"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd2bcde107221bb9c2fa0c4aaba735a537225104173d7e19cf73f70b3126c993"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064b9dbb0217fd64a8d016a8929f2fae6f3312d55ab3036b00b1d17399ab2f3e"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0044b0b8c85a565e7c3ce0a72acc5d35cda60793edf871ed94711e712cb637d"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7184f608ad563032e398f311910bc536e62b9fbdca2041be889afcbc39500de8"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d36f689e7e1b9b6fb39dbdebc16a6f07cbe994d3644fb1c22953020fc575935f"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:54433e421618cd5873e51c0e9d0b9fb35f7bf76eb31c8eab20b3595bb713cd3d"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e1ba0c5857dd743438acecc1cd0e1adf83f0a81fee558e32b2b36f89e40cee8b"}, - {file = "orjson-3.10.13-cp312-cp312-win32.whl", hash = "sha256:a42b9fe4b0114b51eb5cdf9887d8c94447bc59df6dbb9c5884434eab947888d8"}, - {file = "orjson-3.10.13-cp312-cp312-win_amd64.whl", hash = "sha256:3a7df63076435f39ec024bdfeb4c9767ebe7b49abc4949068d61cf4857fa6d6c"}, - {file = "orjson-3.10.13-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2cdaf8b028a976ebab837a2c27b82810f7fc76ed9fb243755ba650cc83d07730"}, - {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a946796e390cbb803e069472de37f192b7a80f4ac82e16d6eb9909d9e39d56"}, - {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d64f1db5ecbc21eb83097e5236d6ab7e86092c1cd4c216c02533332951afc"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:711878da48f89df194edd2ba603ad42e7afed74abcd2bac164685e7ec15f96de"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cf16f06cb77ce8baf844bc222dbcb03838f61d0abda2c3341400c2b7604e436e"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8257c3fb8dd7b0b446b5e87bf85a28e4071ac50f8c04b6ce2d38cb4abd7dff57"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9c3a87abe6f849a4a7ac8a8a1dede6320a4303d5304006b90da7a3cd2b70d2c"}, - {file = "orjson-3.10.13-cp313-cp313-win32.whl", hash = "sha256:527afb6ddb0fa3fe02f5d9fba4920d9d95da58917826a9be93e0242da8abe94a"}, - {file = "orjson-3.10.13-cp313-cp313-win_amd64.whl", hash = "sha256:b5f7c298d4b935b222f52d6c7f2ba5eafb59d690d9a3840b7b5c5cda97f6ec5c"}, - {file = "orjson-3.10.13-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e49333d1038bc03a25fdfe11c86360df9b890354bfe04215f1f54d030f33c342"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:003721c72930dbb973f25c5d8e68d0f023d6ed138b14830cc94e57c6805a2eab"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63664bf12addb318dc8f032160e0f5dc17eb8471c93601e8f5e0d07f95003784"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6066729cf9552d70de297b56556d14b4f49c8f638803ee3c90fd212fa43cc6af"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a1152e2761025c5d13b5e1908d4b1c57f3797ba662e485ae6f26e4e0c466388"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b21d91c5c5ef8a201036d207b1adf3aa596b930b6ca3c71484dd11386cf6c3"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b12a63f48bb53dba8453d36ca2661f2330126d54e26c1661e550b32864b28ce3"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a5a7624ab4d121c7e035708c8dd1f99c15ff155b69a1c0affc4d9d8b551281ba"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0fee076134398d4e6cb827002468679ad402b22269510cf228301b787fdff5ae"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ae537fcf330b3947e82c6ae4271e092e6cf16b9bc2cef68b14ffd0df1fa8832a"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f81b26c03f5fb5f0d0ee48d83cea4d7bc5e67e420d209cc1a990f5d1c62f9be0"}, - {file = "orjson-3.10.13-cp38-cp38-win32.whl", hash = "sha256:0bc858086088b39dc622bc8219e73d3f246fb2bce70a6104abd04b3a080a66a8"}, - {file = "orjson-3.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:3ca6f17467ebbd763f8862f1d89384a5051b461bb0e41074f583a0ebd7120e8e"}, - {file = "orjson-3.10.13-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a11532cbfc2f5752c37e84863ef8435b68b0e6d459b329933294f65fa4bda1a"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c96d2fb80467d1d0dfc4d037b4e1c0f84f1fe6229aa7fea3f070083acef7f3d7"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dda4ba4d3e6f6c53b6b9c35266788053b61656a716a7fef5c884629c2a52e7aa"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f998bbf300690be881772ee9c5281eb9c0044e295bcd4722504f5b5c6092ff"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1cc42ed75b585c0c4dc5eb53a90a34ccb493c09a10750d1a1f9b9eff2bd12"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b0f29d485411e3c13d79604b740b14e4e5fb58811743f6f4f9693ee6480a8f"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:233aae4474078d82f425134bb6a10fb2b3fc5a1a1b3420c6463ddd1b6a97eda8"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e384e330a67cf52b3597ee2646de63407da6f8fc9e9beec3eaaaef5514c7a1c9"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4222881d0aab76224d7b003a8e5fdae4082e32c86768e0e8652de8afd6c4e2c1"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e400436950ba42110a20c50c80dff4946c8e3ec09abc1c9cf5473467e83fd1c5"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f47c9e7d224b86ffb086059cdcf634f4b3f32480f9838864aa09022fe2617ce2"}, - {file = "orjson-3.10.13-cp39-cp39-win32.whl", hash = "sha256:a9ecea472f3eb653e1c0a3d68085f031f18fc501ea392b98dcca3e87c24f9ebe"}, - {file = "orjson-3.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:5385935a73adce85cc7faac9d396683fd813566d3857fa95a0b521ef84a5b588"}, - {file = "orjson-3.10.13.tar.gz", hash = "sha256:eb9bfb14ab8f68d9d9492d4817ae497788a15fd7da72e14dfabc289c3bb088ec"}, + {file = "orjson-3.10.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:849ea7845a55f09965826e816cdc7689d6cf74fe9223d79d758c714af955bcb6"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5947b139dfa33f72eecc63f17e45230a97e741942955a6c9e650069305eb73d"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cde6d76910d3179dae70f164466692f4ea36da124d6fb1a61399ca589e81d69a"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6dfbaeb7afa77ca608a50e2770a0461177b63a99520d4928e27591b142c74b1"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa45e489ef80f28ff0e5ba0a72812b8cfc7c1ef8b46a694723807d1b07c89ebb"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5007abfdbb1d866e2aa8990bd1c465f0f6da71d19e695fc278282be12cffa5"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b49e2af011c84c3f2d541bb5cd1e3c7c2df672223e7e3ea608f09cf295e5f8a"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:164ac155109226b3a2606ee6dda899ccfbe6e7e18b5bdc3fbc00f79cc074157d"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6b1225024cf0ef5d15934b5ffe9baf860fe8bc68a796513f5ea4f5056de30bca"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d6546e8073dc382e60fcae4a001a5a1bc46da5eab4a4878acc2d12072d6166d5"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f1d2942605c894162252d6259b0121bf1cb493071a1ea8cb35d79cb3e6ac5bc"}, + {file = "orjson-3.10.14-cp310-cp310-win32.whl", hash = "sha256:397083806abd51cf2b3bbbf6c347575374d160331a2d33c5823e22249ad3118b"}, + {file = "orjson-3.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:fa18f949d3183a8d468367056be989666ac2bef3a72eece0bade9cdb733b3c28"}, + {file = "orjson-3.10.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f506fd666dd1ecd15a832bebc66c4df45c1902fd47526292836c339f7ba665a9"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe5fd254cfb0eeee13b8ef7ecb20f5d5a56ddda8a587f3852ab2cedfefdb5f6"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ddc8c866d7467f5ee2991397d2ea94bcf60d0048bdd8ca555740b56f9042725"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af8e42ae4363773658b8d578d56dedffb4f05ceeb4d1d4dd3fb504950b45526"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84dd83110503bc10e94322bf3ffab8bc49150176b49b4984dc1cce4c0a993bf9"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5bfc0399cd4811bf10ec7a759c7ab0cd18080956af8ee138097d5b5296a95"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868943660fb2a1e6b6b965b74430c16a79320b665b28dd4511d15ad5038d37d5"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33449c67195969b1a677533dee9d76e006001213a24501333624623e13c7cc8e"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4c9f60f9fb0b5be66e416dcd8c9d94c3eabff3801d875bdb1f8ffc12cf86905"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0de4d6315cfdbd9ec803b945c23b3a68207fd47cbe43626036d97e8e9561a436"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83adda3db595cb1a7e2237029b3249c85afbe5c747d26b41b802e7482cb3933e"}, + {file = "orjson-3.10.14-cp311-cp311-win32.whl", hash = "sha256:998019ef74a4997a9d741b1473533cdb8faa31373afc9849b35129b4b8ec048d"}, + {file = "orjson-3.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:9d034abdd36f0f0f2240f91492684e5043d46f290525d1117712d5b8137784eb"}, + {file = "orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780"}, + {file = "orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1"}, + {file = "orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406"}, + {file = "orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7"}, + {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15"}, + {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010"}, + {file = "orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d"}, + {file = "orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364"}, + {file = "orjson-3.10.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a0fba3b8a587a54c18585f077dcab6dd251c170d85cfa4d063d5746cd595a0f"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175abf3d20e737fec47261d278f95031736a49d7832a09ab684026528c4d96db"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29ca1a93e035d570e8b791b6c0feddd403c6a5388bfe870bf2aa6bba1b9d9b8e"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f77202c80e8ab5a1d1e9faf642343bee5aaf332061e1ada4e9147dbd9eb00c46"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2ec73b7099b6a29b40a62e08a23b936423bd35529f8f55c42e27acccde7954"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d1679df9f9cd9504f8dff24555c1eaabba8aad7f5914f28dab99e3c2552c9d"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691ab9a13834310a263664313e4f747ceb93662d14a8bdf20eb97d27ed488f16"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b11ed82054fce82fb74cea33247d825d05ad6a4015ecfc02af5fbce442fbf361"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:e70a1d62b8288677d48f3bea66c21586a5f999c64ecd3878edb7393e8d1b548d"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:16642f10c1ca5611251bd835de9914a4b03095e28a34c8ba6a5500b5074338bd"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3871bad546aa66c155e3f36f99c459780c2a392d502a64e23fb96d9abf338511"}, + {file = "orjson-3.10.14-cp38-cp38-win32.whl", hash = "sha256:0293a88815e9bb5c90af4045f81ed364d982f955d12052d989d844d6c4e50945"}, + {file = "orjson-3.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:6169d3868b190d6b21adc8e61f64e3db30f50559dfbdef34a1cd6c738d409dfc"}, + {file = "orjson-3.10.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:06d4ec218b1ec1467d8d64da4e123b4794c781b536203c309ca0f52819a16c03"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962c2ec0dcaf22b76dee9831fdf0c4a33d4bf9a257a2bc5d4adc00d5c8ad9034"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21d3be4132f71ef1360385770474f29ea1538a242eef72ac4934fe142800e37f"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28ed60597c149a9e3f5ad6dd9cebaee6fb2f0e3f2d159a4a2b9b862d4748860"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e947f70167fe18469f2023644e91ab3d24f9aed69a5e1c78e2c81b9cea553fb"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64410696c97a35af2432dea7bdc4ce32416458159430ef1b4beb79fd30093ad6"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8050a5d81c022561ee29cd2739de5b4445f3c72f39423fde80a63299c1892c52"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b49a28e30d3eca86db3fe6f9b7f4152fcacbb4a467953cd1b42b94b479b77956"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ca041ad20291a65d853a9523744eebc3f5a4b2f7634e99f8fe88320695ddf766"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d313a2998b74bb26e9e371851a173a9b9474764916f1fc7971095699b3c6e964"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7796692136a67b3e301ef9052bde6fe8e7bd5200da766811a3a608ffa62aaff0"}, + {file = "orjson-3.10.14-cp39-cp39-win32.whl", hash = "sha256:eee4bc767f348fba485ed9dc576ca58b0a9eac237f0e160f7a59bce628ed06b3"}, + {file = "orjson-3.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:96a1c0ee30fb113b3ae3c748fd75ca74a157ff4c58476c47db4d61518962a011"}, + {file = "orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed"}, ] [[package]] @@ -1236,22 +1236,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.29.2" +version = "5.29.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851"}, - {file = "protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9"}, - {file = "protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb"}, - {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e"}, - {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e"}, - {file = "protobuf-5.29.2-cp38-cp38-win32.whl", hash = "sha256:e621a98c0201a7c8afe89d9646859859be97cb22b8bf1d8eacfd90d5bda2eb19"}, - {file = "protobuf-5.29.2-cp38-cp38-win_amd64.whl", hash = "sha256:13d6d617a2a9e0e82a88113d7191a1baa1e42c2cc6f5f1398d3b054c8e7e714a"}, - {file = "protobuf-5.29.2-cp39-cp39-win32.whl", hash = "sha256:36000f97ea1e76e8398a3f02936aac2a5d2b111aae9920ec1b769fc4a222c4d9"}, - {file = "protobuf-5.29.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d2e674c58a06311c8e99e74be43e7f3a8d1e2b2fdf845eaa347fbd866f23355"}, - {file = "protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181"}, - {file = "protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e"}, + {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, + {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, + {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, + {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, + {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, + {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, + {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, + {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, + {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, ] [[package]] @@ -1333,13 +1333,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.4" +version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, - {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, + {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, + {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] [package.dependencies] From 2b2f97086b0598de769fd8644ad29bf43fce9728 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Fri, 10 Jan 2025 08:49:12 -0800 Subject: [PATCH 32/63] source-google-sheets: initial changes for jwt_requester --- .../source_google_sheets/manifest.yaml | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index f02f174b30f04..71e5ea09d8271 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -321,9 +321,17 @@ definitions: - formattedValue schema_pointer: - values - bearer_authenticator: - type: BearerAuthenticator - api_token: "{{ config['credentials']['access_token'] }}" + jwt_authenticator: + type: JwtAuthenticator + secret_key: "{{ config['credentials']['private_key'] }}" + algorithm: "RS256" + token_duration: 3600 + header_prefix: "Bearer" + jwt_payload: + aud: "https://oauth2.googleapis.com/token" + iss: '{{ config["credentials"]["client_email"] }}' + additional_jwt_payload: + scope: "https://www.googleapis.com/auth/spreadsheets.readonly https://www.googleapis.com/auth/drive.readonly" oauth_authenticator: type: OAuthAuthenticator refresh_request_body: {} @@ -332,12 +340,35 @@ definitions: client_id: '{{ config["credentials"]["client_id"] }}' client_secret: '{{ config["credentials"]["client_secret"] }}' refresh_token: '{{ config["credentials"]["refresh_token"] }}' + session_token_authenticator: + type: SessionTokenAuthenticator + $parameters: + name: "session_token_authenticator" + login_requester: + type: HttpRequester + url_base: https://oauth2.googleapis.com + path: token + authenticator: + type: NoAuth + http_method: POST + request_parameters: { } + request_headers: + Content-Type: application/x-www-form-urlencoded + request_body_data: >- + grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=heregoesthetokenassertion + session_token_path: + - access_token + expiration_duration: PT1H + request_authentication: + type: Bearer authenticator: + $parameters: + name: "session_token_authenticator" type: SelectiveAuthenticator authenticator_selection_path: ["credentials", "auth_type"] authenticators: Client: "#/definitions/oauth_authenticator" - Service: "#/definitions/bearer_authenticator" + Service: "#/definitions/session_token_authenticator" schemas: sheets: From 0eef551cc389b2ea07c196d81edc032f17a726d9 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Fri, 10 Jan 2025 08:57:54 -0800 Subject: [PATCH 33/63] source-google-sheets: ruff format --- .../source-google-sheets/source_google_sheets/manifest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 71e5ea09d8271..365ca7dbc4083 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -351,7 +351,7 @@ definitions: authenticator: type: NoAuth http_method: POST - request_parameters: { } + request_parameters: {} request_headers: Content-Type: application/x-www-form-urlencoded request_body_data: >- From 9dace30e6572d4fcda0a17427acb9358f981102b Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 23 Jan 2025 06:19:22 +0100 Subject: [PATCH 34/63] Update authentication, add config migration, and fix backoff --- .../integration_tests/acceptance.py | 2 +- .../connectors/source-google-sheets/main.py | 2 +- .../source_google_sheets/__init__.py | 4 + .../components/__init__.py | 4 + .../components/extractors.py | 7 +- .../components/partition_routers.py | 3 +- .../components/retrievers.py | 5 +- .../source_google_sheets/config_migrations.py | 79 +++++++++++++++++++ .../source_google_sheets/manifest.yaml | 53 +++++-------- .../models/spreadsheet.py | 2 +- .../models/spreadsheet_values.py | 2 +- .../source_google_sheets/run.py | 4 +- .../source_google_sheets/source.py | 17 +--- .../source_google_sheets/utils.py | 2 +- .../config_migration/new_config.json | 1 + .../config_migration/old_config.json | 1 + .../unit_tests/conftest.py | 2 +- .../integration/custom_http_mocker.py | 2 +- .../integration/entrypoint_wrapper_helper.py | 2 +- .../integration/google_sheets_base_test.py | 2 +- .../integration/mock_credentials.py | 2 +- .../integration/protocol_helpers.py | 2 +- .../unit_tests/integration/request_builder.py | 2 +- .../integration/test_auth_credentials.py | 2 +- .../integration/test_exception_description.py | 2 +- .../unit_tests/integration/test_source.py | 2 +- .../unit_tests/test_components.py | 2 +- .../unit_tests/test_config_migration.py | 53 +++++++++++++ .../unit_tests/test_utils.py | 2 +- 29 files changed, 192 insertions(+), 73 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py diff --git a/airbyte-integrations/connectors/source-google-sheets/integration_tests/acceptance.py b/airbyte-integrations/connectors/source-google-sheets/integration_tests/acceptance.py index fbed37992cb4f..80c94b1a58c89 100644 --- a/airbyte-integrations/connectors/source-google-sheets/integration_tests/acceptance.py +++ b/airbyte-integrations/connectors/source-google-sheets/integration_tests/acceptance.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-google-sheets/main.py b/airbyte-integrations/connectors/source-google-sheets/main.py index 7ecf2f8cd0e9e..b9434268776bc 100644 --- a/airbyte-integrations/connectors/source-google-sheets/main.py +++ b/airbyte-integrations/connectors/source-google-sheets/main.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # from source_google_sheets.run import run diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/__init__.py index 2ee5d20195578..a5ce39d11ffa2 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/__init__.py @@ -1,3 +1,7 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + from .source import SourceGoogleSheets __all__ = ["SourceGoogleSheets"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index 26842b5936c4c..bd4927d4c8cd5 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -1,3 +1,7 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + from source_google_sheets.components.extractors import DpathSchemaMatchingExtractor, DpathSchemaExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter from source_google_sheets.components.error_handlers import SheetDataErrorHandler diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 820488ae56426..54b8f8d9be72a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -1,6 +1,7 @@ # -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # + from dataclasses import dataclass from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Union @@ -62,7 +63,7 @@ def parse_raw_schema_values( 3. Removes duplicated fields from the schema. Return a list of tuples with correct property index (by found in array), value and raw_schema """ - raw_schema_properties = self._extract_data(raw_schema_data, schema_pointer) + raw_schema_properties = self._extract_data(raw_schema_data, schema_pointer, default=[]) duplicate_fields = set() parsed_schema_values = [] seen_values = set() @@ -182,7 +183,7 @@ def row_contains_relevant_data(cell_values: List[str], relevant_indices: Iterabl def extract_records(self, response: requests.Response) -> Iterable[MutableMapping[Any, Any]]: raw_records_extracted = super().extract_records(response=response) for raw_record in raw_records_extracted: - unmatched_values_collection = raw_record[self._values_to_match_key] + unmatched_values_collection = raw_record.get(self._values_to_match_key, []) for unmatched_values in unmatched_values_collection: if not DpathSchemaMatchingExtractor.is_row_empty( unmatched_values diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 3d72a3e53b739..0774aa7746ba5 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -1,6 +1,7 @@ # -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # + import logging from typing import Any, Iterable, Mapping diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py index 654b7683cb2cb..0ce8702a7087d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py @@ -1,6 +1,7 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # + from dataclasses import dataclass from typing import Any, Mapping @@ -13,4 +14,4 @@ class SheetsDataRetriever(SimpleRetriever): def __post_init__(self, parameters: Mapping[str, Any]) -> None: super().__post_init__(parameters) - self.stream_slicer: StreamSlicer = RangePartitionRouter(parameters={"batch_size": self.config.get("batch_size"), **parameters}) + self.stream_slicer: StreamSlicer = RangePartitionRouter(parameters=parameters) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py new file mode 100644 index 0000000000000..928ea87dc8362 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py @@ -0,0 +1,79 @@ +import json +from typing import Any, List, Mapping + +import dpath +import orjson + +from airbyte_cdk.config_observation import create_connector_config_control_message +from airbyte_cdk.entrypoint import AirbyteEntrypoint +from airbyte_cdk.models import AirbyteMessageSerializer +from airbyte_cdk.sources.message import InMemoryMessageRepository, MessageRepository +from source_google_sheets import SourceGoogleSheets + + +class MigrateServiceAccountInfo: + """ + Migrates service_account_info to a dict format. + old: + { + "credentials": {"service_account_info": "{ \"some_key\": \"key\" }" + } + new: + { + "credentials": {"service_account": {"some_key": "key"}, "service_account_info": "{ \"some_key\": \"key\" }} + } + """ + + migrate_from_path = ["credentials", "service_account_info"] + migrate_to_path = ["credentials", "service_account"] + + message_repository: MessageRepository = InMemoryMessageRepository() + + @classmethod + def _should_migrate(cls, config: Mapping[str, Any]) -> bool: + service_account_info = dpath.get(config, cls.migrate_from_path, default={}) + if service_account_info and isinstance(service_account_info, str): + return True + return False + + + @classmethod + def _migrate_service_account(cls, config: Mapping[str, Any]) -> Mapping[str, Any]: + service_account = json.loads(config["credentials"]["service_account_info"]) + dpath.new(config, cls.migrate_to_path, service_account) + return config + + @classmethod + def _modify_and_save(cls, config_path: str, source: SourceGoogleSheets, config: Mapping[str, Any]) -> Mapping[str, Any]: + # modify the config + migrated_config = cls._migrate_service_account(config) + # save the config + source.write_config(migrated_config, config_path) + # return modified config + return migrated_config + + @classmethod + def _emit_control_message(cls, migrated_config: Mapping[str, Any]) -> None: + # add the Airbyte Control Message to message repo + cls.message_repository.emit_message(create_connector_config_control_message(migrated_config)) + # emit the Airbyte Control Message from message queue to stdout + for message in cls.message_repository._message_queue: + print(orjson.dumps(AirbyteMessageSerializer.dump(message)).decode()) + + @classmethod + def migrate(cls, args: List[str], source: SourceGoogleSheets) -> None: + """ + This method checks the input args, should the config be migrated, + transform if necessary and emit the CONTROL message. + """ + # get config path + config_path = AirbyteEntrypoint(source).extract_config(args) + # proceed only if `--config` arg is provided + if config_path: + # read the existing config + config = source.read_config(config_path) + # migration check + if cls._should_migrate(config): + cls._emit_control_message( + cls._modify_and_save(config_path, source, config), + ) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 365ca7dbc4083..4024a68b80d09 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -3,8 +3,8 @@ version: 6.7.0 type: DeclarativeSource check: - stream_names: [] - type: CheckStream + type: CheckDynamicStream + stream_count: 1 dynamic_streams: - type: DynamicDeclarativeStream @@ -18,6 +18,7 @@ dynamic_streams: $parameters: row_count: 0 sheet_id: "" + batch_size: 0 paginator: type: NoPagination record_selector: @@ -122,7 +123,7 @@ dynamic_streams: - $parameters - properties_to_match type: ComponentMappingDefinition - value: "{{components_values['data'][0]['rowData'][0]}}" + value: "{{components_values['data'][0].get('rowData', [{}])[0]}}" description: indexed_schema to match with row values. - field_path: - retriever @@ -139,7 +140,6 @@ dynamic_streams: description: sheet_id for retriever. - field_path: - retriever - - partition_router - $parameters - batch_size type: ComponentMappingDefinition @@ -220,8 +220,7 @@ definitions: type: HttpResponseFilter action: FAIL predicate: >- - {{ 'sheets' in response and response["sheets"] | length != - 1 }} + {{ 'sheets' in response and response["sheets"] | length != 1 }} http_codes: [] # error lacks of information as error_message can't interpolate stream_slice["potato"] error_message: >- @@ -248,7 +247,7 @@ definitions: {%- endif -%} {%- endif -%} {%- endfor -%} - Duplicate headers found in sheet. + Duplicate headers found in sheet {{ response["sheets"][0]["properties"]["title"] }}. Ignoring them: {{ duplicate_fields }} fail_duplicate_headers: $ref: "#/definitions/response_filters/ignore_duplicate_headers" @@ -323,13 +322,12 @@ definitions: - values jwt_authenticator: type: JwtAuthenticator - secret_key: "{{ config['credentials']['private_key'] }}" + secret_key: "{{ config['credentials']['service_account']['private_key'] }}" algorithm: "RS256" token_duration: 3600 - header_prefix: "Bearer" jwt_payload: - aud: "https://oauth2.googleapis.com/token" - iss: '{{ config["credentials"]["client_email"] }}' + aud: "{{ config['credentials']['service_account']['token_uri'] }}" + iss: "{{ config['credentials']['service_account']['client_email'] }}" additional_jwt_payload: scope: "https://www.googleapis.com/auth/spreadsheets.readonly https://www.googleapis.com/auth/drive.readonly" oauth_authenticator: @@ -340,35 +338,20 @@ definitions: client_id: '{{ config["credentials"]["client_id"] }}' client_secret: '{{ config["credentials"]["client_secret"] }}' refresh_token: '{{ config["credentials"]["refresh_token"] }}' - session_token_authenticator: - type: SessionTokenAuthenticator - $parameters: - name: "session_token_authenticator" - login_requester: - type: HttpRequester - url_base: https://oauth2.googleapis.com - path: token - authenticator: - type: NoAuth - http_method: POST - request_parameters: {} - request_headers: - Content-Type: application/x-www-form-urlencoded - request_body_data: >- - grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=heregoesthetokenassertion - session_token_path: - - access_token - expiration_duration: PT1H - request_authentication: - type: Bearer + jwt_profile_assertion_oauth_authenticator: + type: OAuthAuthenticator + token_refresh_endpoint: https://oauth2.googleapis.com/token + refresh_request_headers: + Content-Type: application/x-www-form-urlencoded + use_profile_assertion: true + profile_assertion: + $ref: "#/definitions/jwt_authenticator" authenticator: - $parameters: - name: "session_token_authenticator" type: SelectiveAuthenticator authenticator_selection_path: ["credentials", "auth_type"] authenticators: Client: "#/definitions/oauth_authenticator" - Service: "#/definitions/session_token_authenticator" + Service: "#/definitions/jwt_profile_assertion_oauth_authenticator" schemas: sheets: diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet.py index a283feab78281..ab0a6235a2735 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet_values.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet_values.py index 639dc2f1eb485..0a0b584caf378 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet_values.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/models/spreadsheet_values.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index e9c999590f9d6..a09528e5a76d0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # @@ -13,6 +13,7 @@ from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type from source_google_sheets.source import SourceGoogleSheets +from source_google_sheets.config_migrations import MigrateServiceAccountInfo def _get_source(args: List[str]): @@ -49,5 +50,6 @@ def _get_source(args: List[str]): def run(): _args = sys.argv[1:] source = _get_source(_args) + MigrateServiceAccountInfo.migrate(sys.argv[1:], source) if source: launch(source, _args) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index 0dfd96f6dda53..3d6d6b7db6ffc 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -1,6 +1,8 @@ # -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # + +import json import logging from typing import Any, Iterator, List, Mapping, Optional @@ -23,16 +25,3 @@ class SourceGoogleSheets(YamlDeclarativeSource): def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) - - def check(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteConnectionStatus: - manifest_definitions = self.resolved_manifest["definitions"] - dynamic_stream = self.resolved_manifest["dynamic_streams"][0] - retriever_response_filters_path = ["retriever", "requester", "error_handler", "error_handlers", 0, "response_filters"] - - component_resolver_filters_for_check_operation = dpath.get( - manifest_definitions, ["response_filters", "check_operation_single_sheet_response_error_filters"], None - ) - components_resolver_requester_filters_path = ["components_resolver"] + retriever_response_filters_path - dpath.set(dynamic_stream, components_resolver_requester_filters_path, value=component_resolver_filters_for_check_operation) - - return super().check(logger, config) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/utils.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/utils.py index bf3f6a8cc302d..169a7aa4982f9 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/utils.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json new file mode 100644 index 0000000000000..71be3aeeb15e0 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json @@ -0,0 +1 @@ +{"credentials": {"auth_type": "Service", "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }", "service_account": {"type": "service_account", "project_id": "project_id"}}, "spreadsheet_id": "spreadsheet_id"} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json new file mode 100644 index 0000000000000..d5fd80f2c2a3e --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json @@ -0,0 +1 @@ +{"credentials": {"auth_type": "Service", "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }"}, "spreadsheet_id": "spreadsheet_id"} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/conftest.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/conftest.py index 6c8e392764df8..45c80a1925d40 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/conftest.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/conftest.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # import pytest diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py index f54e8cffb53a8..0e08ad0cae709 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. from functools import wraps diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py index 3b06353ac62ae..b1d7e623d7b9e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. import tempfile from pathlib import Path diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py index 77cbb14b90035..ad5f29520f33f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. import json diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py index b7741e7ea0e2b..2342fedce8d05 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. import json diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py index 244370df67d7b..ccb43abf664d8 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. from typing import Any, Dict, Optional, Tuple diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py index b3bd6a4645fe6..ce0be1e1ca572 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. from __future__ import annotations diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index 64ae808d50f2d..fd08d21668a22 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. import json diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 4cad15deaf2ef..51e582cc9e3a1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. from unittest.mock import ANY, patch diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 59fa93137beb9..d353fc8a21249 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. import json diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py index 7188e8e0c0672..f7ca76a296bb1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # import io diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py new file mode 100644 index 0000000000000..d68f73caebf17 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py @@ -0,0 +1,53 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + +import json +import pathlib +from typing import Any, Mapping +from unittest.mock import MagicMock + +import pytest +from source_google_sheets import SourceGoogleSheets +from source_google_sheets.config_migrations import MigrateServiceAccountInfo + +from airbyte_cdk import AirbyteEntrypoint + + +def load_config(path: str) -> Mapping[str, Any]: + with open(path, "r") as f: + return json.load(f) + + +def revert_config(path: str) -> None: + migrated_config = load_config(path) + + del migrated_config["credentials"]["service_account"] + with open(path, "w") as f: + f.write(json.dumps(migrated_config)) + + +@pytest.mark.parametrize( + "config_file_path, run_revert", + [ + (str(pathlib.Path(__file__).parent / "config_migration/old_config.json"), True), + (str(pathlib.Path(__file__).parent / "config_migration/new_config.json"), False), + ], +) +def test_config_migrations(config_file_path, run_revert): + args = ["check", "--config", config_file_path] + source = SourceGoogleSheets( + catalog=MagicMock(), + config=AirbyteEntrypoint.extract_config(args), + state=MagicMock(), + ) + + MigrateServiceAccountInfo().migrate(args, source) + migrated_config = load_config(config_file_path) + + assert "service_account" in migrated_config["credentials"] + assert "service_account_info" in migrated_config["credentials"] + assert isinstance(migrated_config["credentials"]["service_account"], dict) + + if run_revert: + revert_config(config_file_path) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py index 0fe1e6a3a1966..c82a69e80df41 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. # import pytest From 7f052d9e0c8af6fb53e6304601df4f459a1e87c1 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Thu, 23 Jan 2025 05:34:00 +0000 Subject: [PATCH 35/63] chore: auto-fix lint and format issues --- .../source_google_sheets/config_migrations.py | 3 ++- .../source-google-sheets/source_google_sheets/run.py | 2 +- .../unit_tests/config_migration/new_config.json | 9 ++++++++- .../unit_tests/config_migration/old_config.json | 8 +++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py index 928ea87dc8362..cd1d159062abe 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py @@ -1,3 +1,5 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + import json from typing import Any, List, Mapping @@ -36,7 +38,6 @@ def _should_migrate(cls, config: Mapping[str, Any]) -> bool: return True return False - @classmethod def _migrate_service_account(cls, config: Mapping[str, Any]) -> Mapping[str, Any]: service_account = json.loads(config["credentials"]["service_account_info"]) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index a09528e5a76d0..2a7943c4b08f0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -12,8 +12,8 @@ from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type -from source_google_sheets.source import SourceGoogleSheets from source_google_sheets.config_migrations import MigrateServiceAccountInfo +from source_google_sheets.source import SourceGoogleSheets def _get_source(args: List[str]): diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json index 71be3aeeb15e0..b123be596eb21 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json @@ -1 +1,8 @@ -{"credentials": {"auth_type": "Service", "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }", "service_account": {"type": "service_account", "project_id": "project_id"}}, "spreadsheet_id": "spreadsheet_id"} \ No newline at end of file +{ + "credentials": { + "auth_type": "Service", + "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }", + "service_account": { "type": "service_account", "project_id": "project_id" } + }, + "spreadsheet_id": "spreadsheet_id" +} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json index d5fd80f2c2a3e..57285dc6ed382 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json @@ -1 +1,7 @@ -{"credentials": {"auth_type": "Service", "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }"}, "spreadsheet_id": "spreadsheet_id"} \ No newline at end of file +{ + "credentials": { + "auth_type": "Service", + "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }" + }, + "spreadsheet_id": "spreadsheet_id" +} From 65b09ce1c9ab2505250fff3757f970f2cad6d8fa Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 23 Jan 2025 07:43:20 +0100 Subject: [PATCH 36/63] Fix some checks --- .../connectors/source-google-sheets/metadata.yaml | 2 +- .../connectors/source-google-sheets/unit_tests/__init__.py | 0 .../unit_tests/integration/test_source.py | 6 +++--- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index 95e3f7612a699..c6189aa3d7cf6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -31,7 +31,7 @@ data: supportLevel: certified tags: - language:python - - cdk:python + - cdk:low-code connectorTestSuitesOptions: - suite: liveTests testConnections: diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index d353fc8a21249..31ef322a1ff93 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -65,6 +65,7 @@ def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker TestSourceCheck.get_sheet_first_row(http_mocker, "check_succeeded_range") output = self._check(self._config, expecting_exception=False) + breakpoint() expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) assert output.logs[-1] == expected_message @@ -107,8 +108,7 @@ def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: stack_trace=ANY, ), ) - expected_message = AirbyteMessage(type=Type.TRACE, trace=trace_message) - assert output.errors[-1] == expected_message + assert output.is_in_logs('Duplicate headers') @HttpMocker() def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_stream(self, http_mocker: HttpMocker) -> None: @@ -215,7 +215,7 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http expected_catalog = AirbyteCatalog(streams=[expected_stream]) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) expected_log_message = AirbyteMessage( - type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet. Ignoring them: ['header_2']") + type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet a_stream_name. Ignoring them: ['header_2']") ) output = self._discover(self._config, expecting_exception=False) From 1a198688eaa45a8ed6a2d42abd9b420647f833ea Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Thu, 23 Jan 2025 13:07:03 +0000 Subject: [PATCH 37/63] chore: auto-fix lint and format issues --- .../unit_tests/integration/test_source.py | 5 +++-- .../source-google-sheets/unit_tests/test_components.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 31ef322a1ff93..3c5ddc40d199c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -108,7 +108,7 @@ def test_check_duplicated_headers(self, http_mocker: HttpMocker) -> None: stack_trace=ANY, ), ) - assert output.is_in_logs('Duplicate headers') + assert output.is_in_logs("Duplicate headers") @HttpMocker() def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_stream(self, http_mocker: HttpMocker) -> None: @@ -215,7 +215,8 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http expected_catalog = AirbyteCatalog(streams=[expected_stream]) expected_message = AirbyteMessage(type=Type.CATALOG, catalog=expected_catalog) expected_log_message = AirbyteMessage( - type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet a_stream_name. Ignoring them: ['header_2']") + type=Type.LOG, + log=AirbyteLogMessage(level=Level.INFO, message="Duplicate headers found in sheet a_stream_name. Ignoring them: ['header_2']"), ) output = self._discover(self._config, expecting_exception=False) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py index f7ca76a296bb1..5f57a5f982c17 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -12,8 +12,6 @@ from source_google_sheets import SourceGoogleSheets from source_google_sheets.components import DpathSchemaExtractor, DpathSchemaMatchingExtractor from source_google_sheets.components.extractors import RawSchemaParser -from unit_tests.integration.mock_credentials import oauth_credentials -from unit_tests.integration.protocol_helpers import catalog_helper from airbyte_cdk.connector_builder.connector_builder_handler import resolve_manifest from airbyte_cdk.models import SyncMode @@ -21,6 +19,8 @@ IterableDecoder, JsonDecoder, ) +from unit_tests.integration.mock_credentials import oauth_credentials +from unit_tests.integration.protocol_helpers import catalog_helper config = {"field": "record_array"} From 8838242191ec2693c022fba18d4b9db510e72f32 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 23 Jan 2025 20:10:30 +0100 Subject: [PATCH 38/63] Bump CDK version --- .../source-google-sheets/poetry.lock | 284 +++++++++--------- 1 file changed, 144 insertions(+), 140 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index c5099456b77ac..f298003afe20e 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "airbyte-cdk" -version = "6.16.0" +version = "6.25.0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.16.0-py3-none-any.whl", hash = "sha256:ac25427322d7b348ef93c9083906d818aa7f05bbe3065d1d24826d166260cf87"}, - {file = "airbyte_cdk-6.16.0.tar.gz", hash = "sha256:0ddda444c6858fcd876a91d238ecef05a3598536a4ef51d2c485690085965463"}, + {file = "airbyte_cdk-6.25.0-py3-none-any.whl", hash = "sha256:90d2166a11f0692128191a496432097c0e812333dee0d7d6da46b92f9bd2a95f"}, + {file = "airbyte_cdk-6.25.0.tar.gz", hash = "sha256:3d0ee70a16cc59f4deea9e8256b6d3a7443edf481dbc7b1744f6910af7a76b3d"}, ] [package.dependencies] @@ -43,22 +43,22 @@ requests_cache = "*" serpyco-rs = ">=1.10.2,<2.0.0" Unidecode = ">=1.3,<2.0" wcmatch = "10.0" -xmltodict = ">=0.13.0,<0.14.0" +xmltodict = ">=0.13,<0.15" [package.extras] -file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "python-snappy (==0.7.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] +file-based = ["avro (>=1.11.2,<1.13.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "python-snappy (==0.7.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] sql = ["sqlalchemy (>=2.0,!=2.0.36,<3.0)"] vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.8.0)"] [[package]] name = "airbyte-protocol-models-dataclasses" -version = "0.14.1" +version = "0.14.2" description = "Declares the Airbyte Protocol using Python Dataclasses. Dataclasses in Python have less performance overhead compared to Pydantic models, making them a more efficient choice for scenarios where speed and memory usage are critical" optional = false python-versions = ">=3.8" files = [ - {file = "airbyte_protocol_models_dataclasses-0.14.1-py3-none-any.whl", hash = "sha256:dfe10b32ee09e6ba9b4f17bd309e841b61cbd61ec8f80b1937ff104efd6209a9"}, - {file = "airbyte_protocol_models_dataclasses-0.14.1.tar.gz", hash = "sha256:f62a46556b82ea0d55de144983141639e8049d836dd4e0a9d7234c5b2e103c08"}, + {file = "airbyte_protocol_models_dataclasses-0.14.2-py3-none-any.whl", hash = "sha256:ae06a406df031afa42f1156bacc587958197e5c7d9bbaf11893480903d4ded8b"}, + {file = "airbyte_protocol_models_dataclasses-0.14.2.tar.gz", hash = "sha256:9279237156b722cdd54e7b9ec8f97d264bd96e3f3008bc5fc47c215288a2212a"}, ] [[package]] @@ -158,13 +158,13 @@ files = [ [[package]] name = "cachetools" -version = "5.5.0" +version = "5.5.1" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, - {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, + {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, + {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, ] [[package]] @@ -552,13 +552,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.37.0" +version = "2.38.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.37.0-py2.py3-none-any.whl", hash = "sha256:42664f18290a6be591be5329a96fe30184be1a1badb7292a7f686a9659de9ca0"}, - {file = "google_auth-2.37.0.tar.gz", hash = "sha256:0054623abf1f9c83492c63d3f47e77f0a544caa3d40b2d98e099a611c2dd5d00"}, + {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, + {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, ] [package.dependencies] @@ -986,86 +986,90 @@ files = [ [[package]] name = "orjson" -version = "3.10.14" +version = "3.10.15" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:849ea7845a55f09965826e816cdc7689d6cf74fe9223d79d758c714af955bcb6"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5947b139dfa33f72eecc63f17e45230a97e741942955a6c9e650069305eb73d"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cde6d76910d3179dae70f164466692f4ea36da124d6fb1a61399ca589e81d69a"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6dfbaeb7afa77ca608a50e2770a0461177b63a99520d4928e27591b142c74b1"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa45e489ef80f28ff0e5ba0a72812b8cfc7c1ef8b46a694723807d1b07c89ebb"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5007abfdbb1d866e2aa8990bd1c465f0f6da71d19e695fc278282be12cffa5"}, - {file = "orjson-3.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b49e2af011c84c3f2d541bb5cd1e3c7c2df672223e7e3ea608f09cf295e5f8a"}, - {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:164ac155109226b3a2606ee6dda899ccfbe6e7e18b5bdc3fbc00f79cc074157d"}, - {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6b1225024cf0ef5d15934b5ffe9baf860fe8bc68a796513f5ea4f5056de30bca"}, - {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d6546e8073dc382e60fcae4a001a5a1bc46da5eab4a4878acc2d12072d6166d5"}, - {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f1d2942605c894162252d6259b0121bf1cb493071a1ea8cb35d79cb3e6ac5bc"}, - {file = "orjson-3.10.14-cp310-cp310-win32.whl", hash = "sha256:397083806abd51cf2b3bbbf6c347575374d160331a2d33c5823e22249ad3118b"}, - {file = "orjson-3.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:fa18f949d3183a8d468367056be989666ac2bef3a72eece0bade9cdb733b3c28"}, - {file = "orjson-3.10.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f506fd666dd1ecd15a832bebc66c4df45c1902fd47526292836c339f7ba665a9"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe5fd254cfb0eeee13b8ef7ecb20f5d5a56ddda8a587f3852ab2cedfefdb5f6"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ddc8c866d7467f5ee2991397d2ea94bcf60d0048bdd8ca555740b56f9042725"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af8e42ae4363773658b8d578d56dedffb4f05ceeb4d1d4dd3fb504950b45526"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84dd83110503bc10e94322bf3ffab8bc49150176b49b4984dc1cce4c0a993bf9"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5bfc0399cd4811bf10ec7a759c7ab0cd18080956af8ee138097d5b5296a95"}, - {file = "orjson-3.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868943660fb2a1e6b6b965b74430c16a79320b665b28dd4511d15ad5038d37d5"}, - {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33449c67195969b1a677533dee9d76e006001213a24501333624623e13c7cc8e"}, - {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4c9f60f9fb0b5be66e416dcd8c9d94c3eabff3801d875bdb1f8ffc12cf86905"}, - {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0de4d6315cfdbd9ec803b945c23b3a68207fd47cbe43626036d97e8e9561a436"}, - {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83adda3db595cb1a7e2237029b3249c85afbe5c747d26b41b802e7482cb3933e"}, - {file = "orjson-3.10.14-cp311-cp311-win32.whl", hash = "sha256:998019ef74a4997a9d741b1473533cdb8faa31373afc9849b35129b4b8ec048d"}, - {file = "orjson-3.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:9d034abdd36f0f0f2240f91492684e5043d46f290525d1117712d5b8137784eb"}, - {file = "orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d"}, - {file = "orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b"}, - {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe"}, - {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953"}, - {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3"}, - {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780"}, - {file = "orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1"}, - {file = "orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406"}, - {file = "orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7"}, - {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15"}, - {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414"}, - {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1"}, - {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e"}, - {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae"}, - {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010"}, - {file = "orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d"}, - {file = "orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364"}, - {file = "orjson-3.10.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a0fba3b8a587a54c18585f077dcab6dd251c170d85cfa4d063d5746cd595a0f"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175abf3d20e737fec47261d278f95031736a49d7832a09ab684026528c4d96db"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29ca1a93e035d570e8b791b6c0feddd403c6a5388bfe870bf2aa6bba1b9d9b8e"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f77202c80e8ab5a1d1e9faf642343bee5aaf332061e1ada4e9147dbd9eb00c46"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2ec73b7099b6a29b40a62e08a23b936423bd35529f8f55c42e27acccde7954"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d1679df9f9cd9504f8dff24555c1eaabba8aad7f5914f28dab99e3c2552c9d"}, - {file = "orjson-3.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691ab9a13834310a263664313e4f747ceb93662d14a8bdf20eb97d27ed488f16"}, - {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b11ed82054fce82fb74cea33247d825d05ad6a4015ecfc02af5fbce442fbf361"}, - {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:e70a1d62b8288677d48f3bea66c21586a5f999c64ecd3878edb7393e8d1b548d"}, - {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:16642f10c1ca5611251bd835de9914a4b03095e28a34c8ba6a5500b5074338bd"}, - {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3871bad546aa66c155e3f36f99c459780c2a392d502a64e23fb96d9abf338511"}, - {file = "orjson-3.10.14-cp38-cp38-win32.whl", hash = "sha256:0293a88815e9bb5c90af4045f81ed364d982f955d12052d989d844d6c4e50945"}, - {file = "orjson-3.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:6169d3868b190d6b21adc8e61f64e3db30f50559dfbdef34a1cd6c738d409dfc"}, - {file = "orjson-3.10.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:06d4ec218b1ec1467d8d64da4e123b4794c781b536203c309ca0f52819a16c03"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962c2ec0dcaf22b76dee9831fdf0c4a33d4bf9a257a2bc5d4adc00d5c8ad9034"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21d3be4132f71ef1360385770474f29ea1538a242eef72ac4934fe142800e37f"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28ed60597c149a9e3f5ad6dd9cebaee6fb2f0e3f2d159a4a2b9b862d4748860"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e947f70167fe18469f2023644e91ab3d24f9aed69a5e1c78e2c81b9cea553fb"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64410696c97a35af2432dea7bdc4ce32416458159430ef1b4beb79fd30093ad6"}, - {file = "orjson-3.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8050a5d81c022561ee29cd2739de5b4445f3c72f39423fde80a63299c1892c52"}, - {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b49a28e30d3eca86db3fe6f9b7f4152fcacbb4a467953cd1b42b94b479b77956"}, - {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ca041ad20291a65d853a9523744eebc3f5a4b2f7634e99f8fe88320695ddf766"}, - {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d313a2998b74bb26e9e371851a173a9b9474764916f1fc7971095699b3c6e964"}, - {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7796692136a67b3e301ef9052bde6fe8e7bd5200da766811a3a608ffa62aaff0"}, - {file = "orjson-3.10.14-cp39-cp39-win32.whl", hash = "sha256:eee4bc767f348fba485ed9dc576ca58b0a9eac237f0e160f7a59bce628ed06b3"}, - {file = "orjson-3.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:96a1c0ee30fb113b3ae3c748fd75ca74a157ff4c58476c47db4d61518962a011"}, - {file = "orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed"}, + {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf"}, + {file = "orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061"}, + {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3"}, + {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d"}, + {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182"}, + {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e"}, + {file = "orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab"}, + {file = "orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806"}, + {file = "orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13"}, + {file = "orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5"}, + {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b"}, + {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399"}, + {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388"}, + {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c"}, + {file = "orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e"}, + {file = "orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e"}, + {file = "orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41"}, + {file = "orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514"}, + {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17"}, + {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b"}, + {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7"}, + {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a"}, + {file = "orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665"}, + {file = "orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa"}, + {file = "orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e"}, + {file = "orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7"}, + {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8"}, + {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca"}, + {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561"}, + {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825"}, + {file = "orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890"}, + {file = "orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf"}, + {file = "orjson-3.10.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e8afd6200e12771467a1a44e5ad780614b86abb4b11862ec54861a82d677746"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9a18c500f19273e9e104cca8c1f0b40a6470bcccfc33afcc088045d0bf5ea6"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb00b7bfbdf5d34a13180e4805d76b4567025da19a197645ca746fc2fb536586"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33aedc3d903378e257047fee506f11e0833146ca3e57a1a1fb0ddb789876c1e1"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0099ae6aed5eb1fc84c9eb72b95505a3df4267e6962eb93cdd5af03be71c98"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c864a80a2d467d7786274fce0e4f93ef2a7ca4ff31f7fc5634225aaa4e9e98c"}, + {file = "orjson-3.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c25774c9e88a3e0013d7d1a6c8056926b607a61edd423b50eb5c88fd7f2823ae"}, + {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e78c211d0074e783d824ce7bb85bf459f93a233eb67a5b5003498232ddfb0e8a"}, + {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:43e17289ffdbbac8f39243916c893d2ae41a2ea1a9cbb060a56a4d75286351ae"}, + {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:781d54657063f361e89714293c095f506c533582ee40a426cb6489c48a637b81"}, + {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6875210307d36c94873f553786a808af2788e362bd0cf4c8e66d976791e7b528"}, + {file = "orjson-3.10.15-cp38-cp38-win32.whl", hash = "sha256:305b38b2b8f8083cc3d618927d7f424349afce5975b316d33075ef0f73576b60"}, + {file = "orjson-3.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:5dd9ef1639878cc3efffed349543cbf9372bdbd79f478615a1c633fe4e4180d1"}, + {file = "orjson-3.10.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ffe19f3e8d68111e8644d4f4e267a069ca427926855582ff01fc012496d19969"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d433bf32a363823863a96561a555227c18a522a8217a6f9400f00ddc70139ae2"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da03392674f59a95d03fa5fb9fe3a160b0511ad84b7a3914699ea5a1b3a38da2"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a63bb41559b05360ded9132032239e47983a39b151af1201f07ec9370715c82"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3766ac4702f8f795ff3fa067968e806b4344af257011858cc3d6d8721588b53f"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1c73dcc8fadbd7c55802d9aa093b36878d34a3b3222c41052ce6b0fc65f8e8"}, + {file = "orjson-3.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b299383825eafe642cbab34be762ccff9fd3408d72726a6b2a4506d410a71ab3"}, + {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:abc7abecdbf67a173ef1316036ebbf54ce400ef2300b4e26a7b843bd446c2480"}, + {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3614ea508d522a621384c1d6639016a5a2e4f027f3e4a1c93a51867615d28829"}, + {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:295c70f9dc154307777ba30fe29ff15c1bcc9dfc5c48632f37d20a607e9ba85a"}, + {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:63309e3ff924c62404923c80b9e2048c1f74ba4b615e7584584389ada50ed428"}, + {file = "orjson-3.10.15-cp39-cp39-win32.whl", hash = "sha256:a2f708c62d026fb5340788ba94a55c23df4e1869fec74be455e0b2f5363b8507"}, + {file = "orjson-3.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:efcf6c735c3d22ef60c4aa27a5238f1a477df85e9b15f2142f9d669beb2d13fd"}, + {file = "orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e"}, ] [[package]] @@ -2004,52 +2008,52 @@ pyasn1 = ">=0.1.3" [[package]] name = "serpyco-rs" -version = "1.11.0" +version = "1.13.0" description = "" optional = false python-versions = ">=3.9" files = [ - {file = "serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4b2bd933539bd8c84315e2fb5ae52ef7a58ace5a6dfe3f8b73f74dc71216779e"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627f957889ff73c4d2269fc7b6bba93212381befe03633e7cb5495de66ba9a33"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0933620abc01434023e0e3e22255b7e4ab9b427b5a9a5ee00834656d792377a"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9ce46683d92e34abb20304817fc5ac6cb141a06fc7468dedb1d8865a8a9682f6"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bda437d86e8859bf91c189c1f4650899822f6d6d7b02b48f5729da904eb7bb7d"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a72bfbd282af17ebe76d122639013e802c09902543fdbbd828fb2159ec9755e"}, - {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d4808df5384e3e8581e31a90ba7a1fa501c0837b1f174284bb8a4555b6864ea"}, - {file = "serpyco_rs-1.11.0-cp310-none-win_amd64.whl", hash = "sha256:c7b60aef4c16d68efb0d6241f05d0a434d873d98449cbb4366b0d385f0a7172b"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d47ee577cf4d69b53917615cb031ad8708eb2f59fe78194b1968c13130fc2f7"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6090d9a1487237cdd4e9362a823eede23249602019b917e7bd57846179286e79"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7192eb3df576386fefd595ea31ae25c62522841ffec7e7aeb37a80b55bdc3213"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b52ef8affb7e71b9b98a7d5216d6a7ad03b04e990acb147cd9211c8b931c5487"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3480e09e473560c60e74aaa789e6b4d079637371aae0a98235440111464bbba7"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c92e36b0ab6fe866601c2331f7e99c809a126d21963c03d8a5c29331526deed"}, - {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84f497361952d4566bc1f77e9e15a84a2614f593cc671fbf0a0fa80046f9c3d7"}, - {file = "serpyco_rs-1.11.0-cp311-none-win_amd64.whl", hash = "sha256:37fc1cf192bef9784fbf1f4e03cec21750b9e704bef55cc0442f71a715eee920"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3ea93d485f03dc8b0cfb0d477f0ad2e86e78f0461b53010656ab5b4db1b41fb0"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7772410d15694b03f9c5500a2c47d62eed76e191bea4087ad042250346b1a38e"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42118463c1679846cffd2f06f47744c9b9eb33c5d0448afd88ea19e1a81a8ddd"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:79481a455b76cc56021dc55bb6d5bdda1b2b32bcb6a1ee711b597140d112e9b1"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8fd79051f9af9591fc03cf7d3033ff180416301f6a4fd3d1e3d92ebd2d68697"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c8f9aeed734a3b51f7349d04ec9063516ffa4e10b632d75e9b1309e4930e4"}, - {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15609158b0d9591ffa118302cd9d0039970cb3faf91dce32975f7d276e7411d5"}, - {file = "serpyco_rs-1.11.0-cp312-none-win_amd64.whl", hash = "sha256:00081eae77fbf4c5d88371c5586317ab02ccb293a330b460869a283edf2b7b69"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3028893366a1985adcedb13fa8f6f98c087c185efc427f94c2ccdafa40f45832"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c18bf511316f3abf648a68ee62ef88617bec57d3fcde69466b4361102715ae5"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7dde9ef09cdfaf7c62378186b9e29f54ec76114be4c347be6a06dd559c5681e"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:18500ebc5e75285841e35585a238629a990b709e14f68933233640d15ca17d5f"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47c23132d4e03982703a7630aa09877b41e499722142f76b6153f6619b612f3"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f8e6ba499f6a0825bee0d8f8764569d367af871b563fc6512c171474e8e5383"}, - {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15438a076047c34cff6601a977df54948e8d39d1a86f89d05c48bc60f4c12a61"}, - {file = "serpyco_rs-1.11.0-cp313-none-win_amd64.whl", hash = "sha256:84ee2c109415bd81904fc9abb9aec86a5dd13166808c21142cf23ec639f683bd"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5c97c16c865261577fac4effeccc7ef5e0a1e8e35e7a3ee6c90c77c3a4cd7ff9"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47825e70f86fd6ef7c4a835dea3d6e8eef4fee354ed7b39ced99f31aba74a86e"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24d220220365110edba2f778f41ab3cf396883da0f26e1361a3ada9bd0227f73"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a46f334af5a9d77acc6e1e58f355ae497900a2798929371f0545e274f6e6166"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d72b748acce4b4e3c7c9724e1eb33d033a1c26b08a698b393e0288060e0901"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2b8b6f205e8cc038d4d30dd0e70eece7bbecc816eb2f3787c330dc2218e232d"}, - {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038d748bfff31f150f0c3edab2766b8843edb952cb1bd3bf547886beb0912dae"}, - {file = "serpyco_rs-1.11.0-cp39-none-win_amd64.whl", hash = "sha256:0fee1c89ec2cb013dc232e4ebef88e2844357ce8631063b56639dbfb83762f20"}, - {file = "serpyco_rs-1.11.0.tar.gz", hash = "sha256:70a844615ffb229e6e89c204b3ab7404aacaf2838911814c7d847969b8da2e3a"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e722b3053e627d8a304e462bce20cae1670a2c4b0ef875b84d0de0081bec4029"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f10e89c752ff78d720a42e026b0a9ada70717ad6306a9356f794280167d62bf"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99db4ec6b36130d81f409e64759d9e26290138b1000b62f9f244117738aae652"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3265d4467a52540e7309d117c87a0fe97a9c942960159b37af55a164186e4885"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb10e547491d960064e5d935770f503c425b4ab7fc8c81e05b3c4b13bef195b3"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd38a763e9e23f69aad6ba78a8793b6eab9272b51ab01b36a9e3f6208f5c5525"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d49d6d81739aa0b264e303e90bede58a6487cbc6a78019df5ab6059ea988cc"}, + {file = "serpyco_rs-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:cad636c425d942a8de63b4f0e5a8ff91382f36956c129a629bcfd499d8450de2"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2b7ff9a0afc417958203bbb8f4f21ecc47307f6691542af27f61c086870d1c90"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a765f588d23b02ba45b7d3fbe9d828f52eab30836408088abf08ebcbc1969"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c6ab6dfbb477745067871d896675d8c8d8d027d4b4bd36df8e6797caaaa169b"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bf3292411b63c89ca1273717cee374c03dd64da044f297166362b7e8d26bb440"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e568e4bb6ffe51e7f428fe3aa37baa4a0cb52d27a64d7e9a5adfec56d3e8b1f"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16e6b53056de511e3d211e04e0006924e45591c8f68f2aaae024accf28a6127d"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ffe84bb8b5fb361499e1cd9b93b06081e5230b80713341be81793d1d590d9b"}, + {file = "serpyco_rs-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:5988d48f5df9558ea874e385b11b6cfc1dd434d5ed64eefb7762b203e74ce16c"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e7a9d3eb0494984066b6b4d3b8eb25f69a599f401e8ede487efdb035547381b1"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47b519aaddc42b9d56a3a4760c74e4ef3a945e84eefbec96788f279efbd050d8"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e2b463c6b9e307a5fda3579aacb96468c37d14314e3a0070eda2f5789e4b4c6"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f659d8c058f223711d475dcae47adb033e3902591cbb1e5e1b17687ca15cd0bb"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9edc243fdb67a6bd51ec13c9a17cb0d608cfde9beb171ab5200e24045ab123f"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad0b85f02f52ea93f8bf068f0e00c8980702be00375b8888090723a21f35e2bc"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9e49a1a2d6eb9b855b34ce6f27dcbfb6e0dbfa675b3e3f760178c059c9c1100"}, + {file = "serpyco_rs-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:915eb70006944a2819077bb706a1e5deb671f9ac0c963bb3b46073604837f7ff"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:69502ad3c56e6fdb700a27059590cf548a5e1aa03519eef607fdf8f8b320eeed"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:324c6e3eec175cd8aabef071bcef763836fee94012b0b0819952224f9c7b855c"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2097cda3ccf641a3c05ff2aa1a0122f4c47ef4de8807fec816afb93cc6570ee5"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:54fbcd983b50a5ee294ea6d5b1c99c3f8063206660baec96bb4ab5dc211abe3e"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea9608615a24aae8e95f3ccb58aeec7767ad54e6b69edffc7a231b4d6236b83c"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12e4c07e35064a6827473d318e3f60bdf49d8cc2726e5283a51de5ab41a9cc25"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fcbbe5c92d9517a2339a6c51f35c6eda8a0b5ed1a7e741feae960d07369459b"}, + {file = "serpyco_rs-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:11d430b894a2c003f103e1584b7ceb799235e4dcf109bc74e9937982ab8e48d6"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:323c8f2615236d16dcd7995712fe63a77e6362c791890ced8af13b3b205bdbc8"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70527c919bb1560728340d62974beaa1ed050f9d33603270477e089fc90dcc53"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3944a6527ebfa736fc0f5d1841b01fdf9838260aa0f92d9a43ed33b455f911dd"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2ce9f0592490eb87de2b91700c06c5fd7ab5112ae471b88ded9252af06b28f2b"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23a4b801abeb3494a4832250f8a41648914d0fdc8817bc010a2bbb190aa55ca"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d57dd8dc10aa7a81d06c4eb2d523b5241047764a8fa65b94e716975b888d1d54"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd96fc057c6cdc1336ab4e5072eb1710661464ae9b171950347c66c68e687d50"}, + {file = "serpyco_rs-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:94314ed652545eebdc90e83b671cf961ade881fdd0e1aa5579182d13050f8405"}, + {file = "serpyco_rs-1.13.0.tar.gz", hash = "sha256:981232323d2f195a0281b9beb735d5facfc919de6c65abd764cf908c7ad887fe"}, ] [package.dependencies] @@ -2138,13 +2142,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.2" +version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, - {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, ] [[package]] @@ -2216,13 +2220,13 @@ bracex = ">=2.1.1" [[package]] name = "xmltodict" -version = "0.13.0" +version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=3.4" +python-versions = ">=3.6" files = [ - {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, - {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, + {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, + {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, ] [metadata] From 4e2c3fdeb57ac86ff20f5f82de126242bbe4a633 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Fri, 24 Jan 2025 06:50:23 +0100 Subject: [PATCH 39/63] Removed google libs --- .../source-google-sheets/poetry.lock | 227 +----------------- .../source-google-sheets/pyproject.toml | 3 - 2 files changed, 7 insertions(+), 223 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index f298003afe20e..c819f6987ea19 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.25.0" +version = "6.25.2" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.25.0-py3-none-any.whl", hash = "sha256:90d2166a11f0692128191a496432097c0e812333dee0d7d6da46b92f9bd2a95f"}, - {file = "airbyte_cdk-6.25.0.tar.gz", hash = "sha256:3d0ee70a16cc59f4deea9e8256b6d3a7443edf481dbc7b1744f6910af7a76b3d"}, + {file = "airbyte_cdk-6.25.2-py3-none-any.whl", hash = "sha256:ddb9f898510ccec4d9414a07b4d1ee0b3be0801f7f154a329bc390ddafaf0d84"}, + {file = "airbyte_cdk-6.25.2.tar.gz", hash = "sha256:0dbe615ffb51758cb3f602735d2cc106ef747670e488b6142ce6889c921bf759"}, ] [package.dependencies] @@ -508,104 +508,6 @@ files = [ {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] -[[package]] -name = "google-api-core" -version = "2.24.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google_api_core-2.24.0-py3-none-any.whl", hash = "sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9"}, - {file = "google_api_core-2.24.0.tar.gz", hash = "sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-api-python-client" -version = "2.114.0" -description = "Google API Client Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-python-client-2.114.0.tar.gz", hash = "sha256:e041bbbf60e682261281e9d64b4660035f04db1cccba19d1d68eebc24d1465ed"}, - {file = "google_api_python_client-2.114.0-py2.py3-none-any.whl", hash = "sha256:690e0bb67d70ff6dea4e8a5d3738639c105a478ac35da153d3b2a384064e9e1a"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" -google-auth = ">=1.19.0,<3.0.0.dev0" -google-auth-httplib2 = ">=0.1.0" -httplib2 = ">=0.15.0,<1.dev0" -uritemplate = ">=3.0.1,<5" - -[[package]] -name = "google-auth" -version = "2.38.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, - {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-auth-httplib2" -version = "0.2.0" -description = "Google Authentication Library: httplib2 transport" -optional = false -python-versions = "*" -files = [ - {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, - {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, -] - -[package.dependencies] -google-auth = "*" -httplib2 = ">=0.19.0" - -[[package]] -name = "googleapis-common-protos" -version = "1.66.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, - {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - [[package]] name = "h11" version = "0.14.0" @@ -638,20 +540,6 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<1.0)"] -[[package]] -name = "httplib2" -version = "0.22.0" -description = "A comprehensive HTTP client library." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] - -[package.dependencies] -pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} - [[package]] name = "httpx" version = "0.28.1" @@ -1221,43 +1109,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "proto-plus" -version = "1.25.0" -description = "Beautiful, Pythonic protocol buffers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "proto_plus-1.25.0-py3-none-any.whl", hash = "sha256:c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961"}, - {file = "proto_plus-1.25.0.tar.gz", hash = "sha256:fbb17f57f7bd05a68b7707e745e26528b0b3c34e378db91eef93912c54982d91"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<6.0.0dev" - -[package.extras] -testing = ["google-api-core (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "5.29.3" -description = "" -optional = false -python-versions = ">=3.8" -files = [ - {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, - {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, - {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, - {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, - {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, - {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, - {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, - {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, - {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, -] - [[package]] name = "psutil" version = "6.1.0" @@ -1299,31 +1150,6 @@ files = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.1" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, - {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.7.0" - [[package]] name = "pycparser" version = "2.22" @@ -1337,13 +1163,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.5" +version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, - {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] [package.dependencies] @@ -1484,20 +1310,6 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] -[[package]] -name = "pyparsing" -version = "3.2.1" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, - {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pyrate-limiter" version = "3.1.1" @@ -1992,20 +1804,6 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "serpyco-rs" version = "1.13.0" @@ -2162,17 +1960,6 @@ files = [ {file = "Unidecode-1.3.8.tar.gz", hash = "sha256:cfdb349d46ed3873ece4586b96aa75258726e2fa8ec21d6f00a591d98806c2f4"}, ] -[[package]] -name = "uritemplate" -version = "4.1.1" -description = "Implementation of RFC 6570 URI Templates" -optional = false -python-versions = ">=3.6" -files = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, -] - [[package]] name = "url-normalize" version = "1.4.3" @@ -2232,4 +2019,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "16075e8c6000f5472a79d477d6fb7e7c5026a729e69026f045665175e35b92ee" +content-hash = "1baa7ccbf9f7020611ae36318fb3131415161559fda5020f613589c52b4228b3" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index bed7c226a0117..5897091a5b05f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -18,9 +18,6 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" airbyte-cdk = "^6" -google-auth-httplib2 = "==0.2.0" -Unidecode = "==1.3.8" -google-api-python-client = "==2.114.0" [tool.poetry.scripts] source-google-sheets = "source_google_sheets.run:run" From fe14f925e2b5958481c8652a31e644bdca9e6cae Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 14:04:40 +0100 Subject: [PATCH 40/63] Fix unit tests --- .../source-google-sheets/poetry.lock | 146 +++++++++++------- .../source-google-sheets/pyproject.toml | 2 +- .../components/partition_routers.py | 3 +- .../source_google_sheets/manifest.yaml | 2 +- .../unit_tests/integration/test_source.py | 15 +- 5 files changed, 105 insertions(+), 63 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index c819f6987ea19..a7ae2f1594f68 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.25.2" +version = "6.29.0.dev0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.25.2-py3-none-any.whl", hash = "sha256:ddb9f898510ccec4d9414a07b4d1ee0b3be0801f7f154a329bc390ddafaf0d84"}, - {file = "airbyte_cdk-6.25.2.tar.gz", hash = "sha256:0dbe615ffb51758cb3f602735d2cc106ef747670e488b6142ce6889c921bf759"}, + {file = "airbyte_cdk-6.29.0.dev0-py3-none-any.whl", hash = "sha256:6c59ea84b405cb204393da2e024881f76312c181ac225e121b72dbce260fdb10"}, + {file = "airbyte_cdk-6.29.0.dev0.tar.gz", hash = "sha256:a74099d9b958c46a4d0334601232a19ede34c14bafc4d346838c6ab52eb5a8b3"}, ] [package.dependencies] @@ -28,12 +28,11 @@ nltk = "3.9.1" numpy = "<2" orjson = ">=3.10.7,<4.0.0" pandas = "2.2.2" -pendulum = "<3.0.0" psutil = "6.1.0" pydantic = ">=2.7,<3.0" pyjwt = ">=2.8.0,<3.0.0" pyrate-limiter = ">=3.1.0,<3.2.0" -python-dateutil = "*" +python-dateutil = ">=2.9.0,<3.0.0" python-ulid = ">=3.0.0,<4.0.0" pytz = "2024.2" PyYAML = ">=6.0.1,<7.0.0" @@ -43,6 +42,7 @@ requests_cache = "*" serpyco-rs = ">=1.10.2,<2.0.0" Unidecode = ">=1.3,<2.0" wcmatch = "10.0" +whenever = ">=0.6.16,<0.7.0" xmltodict = ">=0.13,<0.15" [package.extras] @@ -117,13 +117,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -1044,40 +1044,6 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] -[[package]] -name = "pendulum" -version = "2.1.2" -description = "Python datetimes made easy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] - -[package.dependencies] -python-dateutil = ">=2.6,<3.0" -pytzdata = ">=2020.1" - [[package]] name = "platformdirs" version = "4.3.6" @@ -1446,17 +1412,6 @@ files = [ {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] -[[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -2005,6 +1960,89 @@ files = [ [package.dependencies] bracex = ">=2.1.1" +[[package]] +name = "whenever" +version = "0.6.16" +description = "Modern datetime library for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "whenever-0.6.16-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:901783ba877b5d73ce5b1bc1697c6097a9ac14c43064788b24ec7dc75a85a90a"}, + {file = "whenever-0.6.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d374cd750ea68adb4ad69d52aef3838eda38ae63183c6135b122772ac053c66"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72b757e631a49fb196dfd9de82ae3eeed2495ebef485b670f493158891e6fc91"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:393f87555d59ca3df5298bddb73978682c70202a910833fe40d20e185875e5e0"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4a867eaf2092a6ac3471d314bf481f28f27f23e17ff0f5368c43d802910bbf1"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10f39f498476ca94afd45688a0832fa6ad99649fa05a127c04eff74429be59c6"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75dc59ccd03f371e20c8baecbc34f9f18da8ff79b30efd351e16179136faf98"}, + {file = "whenever-0.6.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a37b9b3663682c57d0f54bc29c57c5cf101e697ce10748fb3aaafb62679ae66"}, + {file = "whenever-0.6.16-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d14ba610412d14e63e2eadbd6eaff88e7754ddb5a364afc670d04060d082ecdf"}, + {file = "whenever-0.6.16-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:fd871bf116347ca2a0a4819ba99050a8e3171248cf1fda83d0e3175ca1c1c486"}, + {file = "whenever-0.6.16-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ee4b3c4e12e422e87b6b3fab9bc752d66a2b41faa4ac098f07a633e192bc7757"}, + {file = "whenever-0.6.16-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2fe71ef0b9e47c49e45d1a099761a415822ef4b017f658161e10c08ab2b4c206"}, + {file = "whenever-0.6.16-cp310-cp310-win32.whl", hash = "sha256:1f9d27fac39c09ffe60a5c4c9e00b084b9928692eaf568e18d14f7dd7f0c6645"}, + {file = "whenever-0.6.16-cp310-cp310-win_amd64.whl", hash = "sha256:0f9b2de554b2ca20d13abf2b6720e3f61a0569fe7f469e4cd923c2ce19007441"}, + {file = "whenever-0.6.16-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f23620a8b19eeb40d429c140a7856425d4544e40e4e72c99617a291decf70"}, + {file = "whenever-0.6.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f62f9413e72f395e31b7ecb57a3609e1a9dd55b8751ee2644b7992daebf6c420"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06f02b0e8f26bf96e0e9f58d181b244a934dde20e4fe874125567454f98ada22"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13d1d6b0c2ab67df6e53793b175ebc9c10bf5b527f111c9b515d8d538132fa75"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f861cd67088dc3e129d915681fc30e982b35e1f09ac609f3a424e62c889eff81"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a14f413b8137feba02b880c440516669439262daa303f720e5cf38f60774202"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9e263553c850f3d79d657ed5274d4b3d1f603dff6c3dfcd0f345a44045804e"}, + {file = "whenever-0.6.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7567fd28715d7b4141e794f69cf873fe3c6e77b4ac2da233d757c420da4bed5b"}, + {file = "whenever-0.6.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d93d1e2e40ebf07161eae9846b20ce1fa0e20b064b4d624de80ead23d00aa080"}, + {file = "whenever-0.6.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e523804f74bde38781bfb69a6407d3d39a303d51bb072f408f44479870d7956e"}, + {file = "whenever-0.6.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:617b35e2ee3bf421e3b5d9fee75f3a15cd77d8d34b20feaa7833887d7e995ec0"}, + {file = "whenever-0.6.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1129bdc898078bb17eb0264f9265b97ae37bc8c53c67e369152070eb54a60357"}, + {file = "whenever-0.6.16-cp311-cp311-win32.whl", hash = "sha256:f38f414a56b5cd263276ae2862e3021d3459d16169d11b47574e85bb45e6dff5"}, + {file = "whenever-0.6.16-cp311-cp311-win_amd64.whl", hash = "sha256:a8ce689945604569ac043a739ca8b8d1a5492adf51926e0826f8f76f3ae75fe8"}, + {file = "whenever-0.6.16-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5a476a14cb8611410e741a30c0867112ac720e719fc6db71c0d7655de13e4e0d"}, + {file = "whenever-0.6.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6edb265a6a2846cf4ccde17dfb7339f576f7bfe762a8ac9182d0d776aa084a5"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c1e5b0350f641322d2c57415b1677ffd3809f5e18c9a04aba33c8f0c20728eb"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a026a77c512c409dccc6d7f8999be23a33729277ca5291f8d741344d082b89b"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2baf467459c1b032a326bcb5f4ec50d38dd08f21584a66955d6a6080b124448b"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8b0e4b245931617cf45db97e625d7c612bdd0c7136ea09f561242dbee3a4cc1"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d98140aeb0e6e06877d1ce02a3745aaad9f8d02003f73d0abdfd89603c9f2f16"}, + {file = "whenever-0.6.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:60bfb0edccdd9c8298fad2e2fdf123037c13ef1188af59dd7140e47269dde90e"}, + {file = "whenever-0.6.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c53ab7c29acdbe61c3ef137a0b6f238e55aa9acb15a0716ad214f081e42ead46"}, + {file = "whenever-0.6.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:71f40ebd90334513de1d36218ad4737882bc2cf30193dac6e52145bf88904350"}, + {file = "whenever-0.6.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fa306fd8cae8b60c9293f42959039d1f335f6a9cec61df3530518f12a3ffdbf2"}, + {file = "whenever-0.6.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b749e2fe5f32feb957ebd8e502865ab7d38268ae4e810151f6169bfde3920b3a"}, + {file = "whenever-0.6.16-cp312-cp312-win32.whl", hash = "sha256:c6e4be4a9e9cf64587c4c1ca7b55863cf7af978e49f1834c85ef91d54c9194fd"}, + {file = "whenever-0.6.16-cp312-cp312-win_amd64.whl", hash = "sha256:4bff1d479fd708c492eab8188bb21d3e1d127f44ee19f4d382c797901c5bec58"}, + {file = "whenever-0.6.16-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:54eb6f9607dbb5b7635ed688647b962d671e3e09ecf25abce588ad9b015ad3fc"}, + {file = "whenever-0.6.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:933887c55273df102f1fbf3985a986d23c31cc5c07f7234349fff6d8bdd4d7ce"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c83e4500045b46ab7b07e5fc222ab2ed3b0bd1663a72d3d533a81a8975be8b25"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c0f1edec8ab9e05533d8ce5ee41fad982139f805725cef81a200efe3ca07f66"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dead9bece03678ed5def0a29353d363838e1ac25f6e2a946d4f25c85842ba3a3"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c04c6aff944998bb2efee347cebeae9caea4254626ae5692d0b4673b4c9b73"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73333e2d9fa41dc3fe036eedd097b142fab53e1bfb834f4b8cf70db79ed875ce"}, + {file = "whenever-0.6.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b341c7c595e09f6bbbaed03545dcc7f9f2d75be22ec2e74cd9e753d491b2782d"}, + {file = "whenever-0.6.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c04d3ce681a5af99358723ff24d471d913efcf57a5fe409e3fdee92de9952529"}, + {file = "whenever-0.6.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:751ba7e4d12bdf209bb903a44e8438b6ff2e565ddaf7e1b51a6f06d0367f6a8e"}, + {file = "whenever-0.6.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bddbde931205e4f2907ced9de2d79c51d0eab4030612a87471ed79edf25699e5"}, + {file = "whenever-0.6.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:91dafc986a98928f13f39c2a33780e68155e75eabcf9af2bb20d737ad9c9be2f"}, + {file = "whenever-0.6.16-cp313-cp313-win32.whl", hash = "sha256:5e5fec5c7fb76fea1c8318ac8b4e131e9c25e96a66b52e0610898d05d2178f7a"}, + {file = "whenever-0.6.16-cp313-cp313-win_amd64.whl", hash = "sha256:c7dca9817d86a1d9b3fea3adef51ae215ead1734a75f11677667c2b27d65399f"}, + {file = "whenever-0.6.16-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:afa15189ae68a7a713412175dceca27aaf09dd17094c3b4adf5807853cc6417c"}, + {file = "whenever-0.6.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4acd4e551b22ad501c6b10846ae66ef130e6594677bf1466193cad4ee5f4066"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f63ffc069f2bf21bbb4065125eacb06a770f10741ec71ad1a6d495f73c1113b"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:596305ffa4089660f7b113614b6b904461c71d25e53d9f1726c9a34e47cb470f"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ec4a3d482006eee1403f114f8592591d8fc4a64f0c9fa01aac267fddb95cfed"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c86b79ca693345bc21fef1f5a4881d4c809a2de97f218fb977860ee9410546a"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8da5f576e87ebf876f15e2c400402be464e34a697285737dee5001bb7d42138d"}, + {file = "whenever-0.6.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bb4fa8782cf2d021cf40ac76b5d1ee93b40a298b752edbb28ee35ceb983d645"}, + {file = "whenever-0.6.16-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a5584172b699107a72d232e2b467a0732052d1607b3502c5d4134b79db8a0025"}, + {file = "whenever-0.6.16-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d8801a9a25966c412cb16fc553a9654bc8c7c959d2be55a66c6342465bc86e41"}, + {file = "whenever-0.6.16-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3f7e018b4667caacab51b3f5ea2185a99d78b87655616134e9e0762e46180ea7"}, + {file = "whenever-0.6.16-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69439fed59088e0bf6f71a33592a8b2054343fe23a058959de983f279f11be58"}, + {file = "whenever-0.6.16-cp39-cp39-win32.whl", hash = "sha256:ce8cae918011048ca73a3a230d03cfdcf7a39a68c7d9900258b20cdaf4afc124"}, + {file = "whenever-0.6.16-cp39-cp39-win_amd64.whl", hash = "sha256:32fdbc1106cca40dbc69b67f4298a9beff1fdd730653fc8625b26050f95f1deb"}, + {file = "whenever-0.6.16.tar.gz", hash = "sha256:f21677f96765953418ad146d97e927e8d6bf16e138348c35c1201eb0e38a38b6"}, +] + +[package.dependencies] +tzdata = {version = ">=2020.1", markers = "sys_platform == \"win32\""} + [[package]] name = "xmltodict" version = "0.14.2" @@ -2019,4 +2057,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "1baa7ccbf9f7020611ae36318fb3131415161559fda5020f613589c52b4228b3" +content-hash = "ff7451304535a225f3eeb72c919b54d9dfaa516b3a9f1fb1f025c8ac5ea1868d" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 5897091a5b05f..2a8add6cca3d7 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = "^6" +airbyte-cdk = { version = "6.29.0.dev0", allow-prereleases = true } [tool.poetry.scripts] source-google-sheets = "source_google_sheets.run:run" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 0774aa7746ba5..3ff16482a3aaa 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -28,7 +28,8 @@ def __init__(self, parameters: Mapping[str, Any]) -> None: self.batch_size_manager = BatchSizeManager(parameters.get("batch_size")) def stream_slices(self) -> Iterable[StreamSlice]: - start_range = 2 + start_range = 2 # skip 1 row, as expected column (fields) names there + while start_range <= self.sheet_row_count: end_range = start_range + self.batch_size_manager.get_batch_size() logger.info(f"Fetching range {self._sheet_id}!{start_range}:{end_range}") diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 4024a68b80d09..ca6d3de073bfa 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -5,6 +5,7 @@ type: DeclarativeSource check: type: CheckDynamicStream stream_count: 1 + use_check_availability: false dynamic_streams: - type: DynamicDeclarativeStream @@ -221,7 +222,6 @@ definitions: action: FAIL predicate: >- {{ 'sheets' in response and response["sheets"] | length != 1 }} - http_codes: [] # error lacks of information as error_message can't interpolate stream_slice["potato"] error_message: >- Unable to read the schema of sheet. Error: Unexpected return diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 3c5ddc40d199c..b90146d19101b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -65,7 +65,6 @@ def test_given_spreadsheet_when_check_then_status_is_succeeded(self, http_mocker TestSourceCheck.get_sheet_first_row(http_mocker, "check_succeeded_range") output = self._check(self._config, expecting_exception=False) - breakpoint() expected_message = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="Check succeeded")) assert output.logs[-1] == expected_message @@ -116,7 +115,8 @@ def test_given_grid_sheet_type_with_at_least_one_row_when_discover_then_return_s TestSourceCheck.get_sheet_first_row(http_mocker, "only_headers_range", 200) expected_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": True, "properties": {"header1": {"type": ["null", "string"]}, "header2": {"type": ["null", "string"]}}, "type": "object", } @@ -149,7 +149,8 @@ def test_discover_return_expected_schema(self, http_mocker: HttpMocker) -> None: expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): expected_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": True, "properties": expected_stream_properties, "type": "object", } @@ -178,7 +179,8 @@ def test_discover_empty_column_return_expected_schema(self, http_mocker: HttpMoc expected_streams = [] for expected_stream_name, expected_stream_properties in expected_schemas_properties.items(): expected_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": True, "properties": expected_stream_properties, "type": "object", } @@ -207,7 +209,7 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - expected_schema = {"$schema": "http://json-schema.org/draft-07/schema#", "properties": expected_schema_properties, "type": "object"} + expected_schema = {"$schema": "https://json-schema.org/draft-07/schema#", "additionalProperties": True, "properties": expected_schema_properties, "type": "object"} expected_stream = AirbyteStream( name=_STREAM_NAME, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False ) @@ -230,7 +232,8 @@ def test_discover_with_names_conversion(self, http_mocker: HttpMocker) -> None: GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, "only_headers_meta", 200) GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, "names_conversion_range", 200) expected_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": True, "properties": {"_1_test": {"type": ["null", "string"]}, "header_2": {"type": ["null", "string"]}}, "type": "object", } From 8014fca4604be52aa6a0acef3c0b043329998f49 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Wed, 29 Jan 2025 13:07:32 +0000 Subject: [PATCH 41/63] chore: auto-fix lint and format issues --- .../unit_tests/integration/test_source.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index b90146d19101b..7ba8f61eb9447 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -209,7 +209,12 @@ def test_discover_with_duplicated_return_expected_schema(self, http_mocker: Http GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}") GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}") - expected_schema = {"$schema": "https://json-schema.org/draft-07/schema#", "additionalProperties": True, "properties": expected_schema_properties, "type": "object"} + expected_schema = { + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": True, + "properties": expected_schema_properties, + "type": "object", + } expected_stream = AirbyteStream( name=_STREAM_NAME, json_schema=expected_schema, supported_sync_modes=[SyncMode.full_refresh], is_resumable=False ) From 3331a9bc8203e96eee8d17c7b276204925d196ba Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 14:48:03 +0100 Subject: [PATCH 42/63] Update configs name --- .../connectors/source-google-sheets/metadata.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index c6189aa3d7cf6..fb994dd21d184 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -40,17 +40,17 @@ data: - suite: unitTests - suite: acceptanceTests testSecrets: - - name: SECRET_SOURCE-GOOGLE_SHEETS_CREDS + - name: SECRET_SOURCE-GOOGLE_SHEETS__CREDS fileName: config.json secretStore: type: GSM alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-GOOGLE_SHEETS_SERVICE_CREDS + - name: SECRET_SOURCE-GOOGLE_SHEETS_SERVICE__CREDS fileName: service_config.json secretStore: type: GSM alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-GOOGLE_SHEETS_WITH_URL_CREDS + - name: SECRET_SOURCE-GOOGLE_SHEETS_WITH_URL__CREDS fileName: config_with_url.json secretStore: type: GSM From 90eb46d859936d1cbb57d5ce49eabb38b12148d3 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 15:45:30 +0100 Subject: [PATCH 43/63] Update test secrets names --- .../connectors/source-google-sheets/metadata.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index fb994dd21d184..797b8b8aecf32 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -40,17 +40,17 @@ data: - suite: unitTests - suite: acceptanceTests testSecrets: - - name: SECRET_SOURCE-GOOGLE_SHEETS__CREDS + - name: SECRET_SOURCE-GOOGLE-SHEETS__CREDS fileName: config.json secretStore: type: GSM alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-GOOGLE_SHEETS_SERVICE__CREDS + - name: SECRET_SOURCE-GOOGLE-SHEETS_SERVICE__CREDS fileName: service_config.json secretStore: type: GSM alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-GOOGLE_SHEETS_WITH_URL__CREDS + - name: SECRET_SOURCE-GOOGLE-SHEETS_WITH_URL__CREDS fileName: config_with_url.json secretStore: type: GSM From d3cb431a10abff4dcf0c184d819c9f8f87f39165 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 16:50:01 +0100 Subject: [PATCH 44/63] Fix coverage --- .../source_google_sheets/config_migrations.py | 4 ++- .../source_google_sheets/source.py | 7 +--- .../unit_tests/__init__.py | 3 ++ .../unit_tests/integration/__init__.py | 3 ++ .../integration/conftest/__init__.py | 33 +++++++++++++++++++ .../{ => conftest}/custom_http_mocker.py | 5 +-- .../entrypoint_wrapper_helper.py | 2 ++ .../{ => conftest}/google_sheets_base_test.py | 3 +- .../{ => conftest}/mock_credentials.py | 3 ++ .../{ => conftest}/protocol_helpers.py | 4 ++- .../{ => conftest}/request_builder.py | 4 +-- .../integration/test_auth_credentials.py | 9 +++-- .../integration/test_exception_description.py | 5 +-- .../unit_tests/integration/test_source.py | 14 +++----- .../unit_tests/test_components.py | 3 +- .../unit_tests/test_utils.py | 21 ++++++++++++ 16 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/custom_http_mocker.py (97%) rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/entrypoint_wrapper_helper.py (99%) rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/google_sheets_base_test.py (99%) rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/mock_credentials.py (99%) rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/protocol_helpers.py (97%) rename airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/{ => conftest}/request_builder.py (94%) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py index cd1d159062abe..72fdff6fc8114 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py @@ -1,4 +1,6 @@ -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# import json from typing import Any, List, Mapping diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py index 3d6d6b7db6ffc..30e0cdb0ee4a2 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/source.py @@ -2,12 +2,7 @@ # Copyright (c) 2025 Airbyte, Inc., all rights reserved. # -import json -import logging -from typing import Any, Iterator, List, Mapping, Optional - -import dpath -from airbyte_protocol_dataclasses.models import AirbyteConnectionStatus, AirbyteMessage, AirbyteStateMessage +from typing import Any, Mapping, Optional from airbyte_cdk.models import ConfiguredAirbyteCatalog from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py index e69de29bb2d1d..2acb8555b306c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/__init__.py index e69de29bb2d1d..2acb8555b306c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py new file mode 100644 index 0000000000000..b7c47f074145d --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py @@ -0,0 +1,33 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + +from custom_http_mocker import parse_and_transform, CustomHttpMocker +from entrypoint_wrapper_helper import check +from google_sheets_base_test import GoogleSheetsBaseTest +from mock_credentials import test_private_key, AUTH_BODY, service_account_info, service_account_info_encoded, service_account_credentials, oauth_credentials +from protocol_helpers import catalog_helper, check_helper, discover_helper, read_helper +from request_builder import GOOGLE_SHEETS_BASE_URL, OAUTH_AUTHORIZATION_ENDPOINT, RequestBuilder, AuthBuilder + + +__all__ = [ + "parse_and_transform", + "CustomHttpMocker", + "check", + "GoogleSheetsBaseTest", + "test_private_key", + "service_account_info", + "AUTH_BODY", + "service_account_info_encoded", + "service_account_credentials", + "oauth_credentials", + "catalog_helper", + "check_helper", + "discover_helper", + "read_helper", + "GOOGLE_SHEETS_BASE_URL", + "OAUTH_AUTHORIZATION_ENDPOINT", + "RequestBuilder", + "AuthBuilder", + +] diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py similarity index 97% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py index 0e08ad0cae709..5a9ed9c241338 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/custom_http_mocker.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py @@ -1,10 +1,11 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. - +# from functools import wraps from typing import Dict from unittest.mock import patch -from urllib.parse import parse_qsl, unquote, urlencode, urlunparse +from urllib.parse import unquote, urlunparse from httplib2 import Response diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/entrypoint_wrapper_helper.py similarity index 99% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/entrypoint_wrapper_helper.py index b1d7e623d7b9e..880bc9712d5bf 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/entrypoint_wrapper_helper.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/entrypoint_wrapper_helper.py @@ -1,4 +1,6 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# import tempfile from pathlib import Path diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py similarity index 99% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py index ad5f29520f33f..7fa49959d2e87 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py @@ -1,5 +1,6 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. - +# import json from abc import ABC diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/mock_credentials.py similarity index 99% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/mock_credentials.py index 2342fedce8d05..2f5b472855a46 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/mock_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/mock_credentials.py @@ -1,4 +1,7 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + import json diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/protocol_helpers.py similarity index 97% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/protocol_helpers.py index ccb43abf664d8..52ef01c60b761 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/protocol_helpers.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/protocol_helpers.py @@ -1,7 +1,9 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# -from typing import Any, Dict, Optional, Tuple +from typing import Any, Dict, Optional from source_google_sheets import SourceGoogleSheets diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/request_builder.py similarity index 94% rename from airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py rename to airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/request_builder.py index ce0be1e1ca572..5a0abbfebb07a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/request_builder.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/request_builder.py @@ -1,13 +1,13 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# from __future__ import annotations from airbyte_cdk.test.mock_http.request import HttpRequest -# todo: this should be picked from manifest in the future GOOGLE_SHEETS_BASE_URL = "https://sheets.googleapis.com/v4/spreadsheets" -# OAUTH_AUTHORIZATION_ENDPOINT = "https://oauth2.googleapis.com" OAUTH_AUTHORIZATION_ENDPOINT = "https://www.googleapis.com/oauth2/v4" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index fd08d21668a22..c16021833ec8c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -1,9 +1,10 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. - +# import json from copy import deepcopy -from unittest.mock import ANY, patch +from unittest.mock import ANY import pytest @@ -20,9 +21,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from .google_sheets_base_test import GoogleSheetsBaseTest -from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info -from .request_builder import AuthBuilder, RequestBuilder +from conftest import GoogleSheetsBaseTest, AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info, AuthBuilder _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 51e582cc9e3a1..42412d9bccea0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -1,5 +1,6 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. - +# from unittest.mock import ANY, patch @@ -16,7 +17,7 @@ from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder from airbyte_cdk.test.mock_http import HttpMocker -from .google_sheets_base_test import GoogleSheetsBaseTest +from conftest import GoogleSheetsBaseTest _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 7ba8f61eb9447..4e2a0d2c98b84 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -1,15 +1,13 @@ +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. - +# import json from copy import deepcopy -from typing import Any, Dict, Optional, Tuple -from unittest import TestCase -from unittest.mock import ANY, patch +from unittest.mock import ANY import pytest from requests.status_codes import codes as status_codes -from source_google_sheets.utils import exception_description_by_status_code from airbyte_cdk.models import ( AirbyteCatalog, @@ -32,14 +30,10 @@ ) from airbyte_cdk.models.airbyte_protocol import AirbyteStateBlob, AirbyteStreamStatus from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder -from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from .google_sheets_base_test import GoogleSheetsBaseTest -from .mock_credentials import AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info -from .protocol_helpers import check_helper, discover_helper, read_helper -from .request_builder import AuthBuilder, RequestBuilder +from conftest import GoogleSheetsBaseTest, oauth_credentials, service_account_credentials _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py index 5f57a5f982c17..2c95fb85aa267 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -19,8 +19,7 @@ IterableDecoder, JsonDecoder, ) -from unit_tests.integration.mock_credentials import oauth_credentials -from unit_tests.integration.protocol_helpers import catalog_helper +from unit_tests.integration.conftest import oauth_credentials, catalog_helper config = {"field": "record_array"} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py index c82a69e80df41..910eaea6d8d3d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py @@ -24,3 +24,24 @@ def test_safe_name_conversion(): with pytest.raises(Exception) as exc_info: safe_name_conversion("*****") assert exc_info.value.args[0] == "initial string '*****' converted to empty" + +@pytest.mark.parametrize( + "status_code, expected_message", + [ + ( + 404, + "The requested Google Sheets spreadsheet with id spreadsheet_id does not exist. Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support", + ), + (429, "Rate limit has been reached. Please try later or request a higher quota for your account."), + ( + 500, + "There was an issue with the Google Sheets API. This is usually a temporary issue from Google's side. Please try again. If this issue persists, contact support", + ), + ( + 403, + "The authenticated Google Sheets user does not have permissions to view the spreadsheet with id spreadsheet_id. Please ensure the authenticated user has access to the Spreadsheet and reauthenticate. If the issue persists, contact support", + ), + ], +) +def test_exception_description_by_status_code(status_code, expected_message): + assert expected_message == exception_description_by_status_code(status_code, "spreadsheet_id") From 3d724ba6bd881296e308d1631d7dd0d5dd801bca Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Wed, 29 Jan 2025 15:52:56 +0000 Subject: [PATCH 45/63] chore: auto-fix lint and format issues --- .../unit_tests/integration/test_auth_credentials.py | 3 +-- .../unit_tests/integration/test_exception_description.py | 3 +-- .../source-google-sheets/unit_tests/integration/test_source.py | 3 +-- .../source-google-sheets/unit_tests/test_components.py | 2 +- .../connectors/source-google-sheets/unit_tests/test_utils.py | 1 + 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index c16021833ec8c..28dc21b0b732b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -7,6 +7,7 @@ from unittest.mock import ANY import pytest +from conftest import AUTH_BODY, AuthBuilder, GoogleSheetsBaseTest, oauth_credentials, service_account_credentials, service_account_info from airbyte_cdk.models import ( AirbyteConnectionStatus, @@ -21,8 +22,6 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from conftest import GoogleSheetsBaseTest, AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info, AuthBuilder - _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 42412d9bccea0..3256bc85bb88a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -4,6 +4,7 @@ from unittest.mock import ANY, patch +from conftest import GoogleSheetsBaseTest from requests.status_codes import codes as status_codes from airbyte_cdk.models import ( @@ -17,8 +18,6 @@ from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder from airbyte_cdk.test.mock_http import HttpMocker -from conftest import GoogleSheetsBaseTest - _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 4e2a0d2c98b84..429b27247cb2d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -7,6 +7,7 @@ from unittest.mock import ANY import pytest +from conftest import GoogleSheetsBaseTest, oauth_credentials, service_account_credentials from requests.status_codes import codes as status_codes from airbyte_cdk.models import ( @@ -33,8 +34,6 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from conftest import GoogleSheetsBaseTest, oauth_credentials, service_account_credentials - _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py index 2c95fb85aa267..3d37c0353aa80 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_components.py @@ -19,7 +19,7 @@ IterableDecoder, JsonDecoder, ) -from unit_tests.integration.conftest import oauth_credentials, catalog_helper +from unit_tests.integration.conftest import catalog_helper, oauth_credentials config = {"field": "record_array"} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py index 910eaea6d8d3d..51fccb7b72245 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_utils.py @@ -25,6 +25,7 @@ def test_safe_name_conversion(): safe_name_conversion("*****") assert exc_info.value.args[0] == "initial string '*****' converted to empty" + @pytest.mark.parametrize( "status_code, expected_message", [ From 3f2b754a0b2dd0af979b80cf725edb9cbde9c056 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 17:17:43 +0100 Subject: [PATCH 46/63] Fix unit tests --- .../unit_tests/integration/conftest/__init__.py | 12 ++++++------ .../unit_tests/integration/test_auth_credentials.py | 2 +- .../integration/test_exception_description.py | 2 +- .../unit_tests/integration/test_source.py | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py index b7c47f074145d..940165e5350ef 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py @@ -2,12 +2,12 @@ # Copyright (c) 2025 Airbyte, Inc., all rights reserved. # -from custom_http_mocker import parse_and_transform, CustomHttpMocker -from entrypoint_wrapper_helper import check -from google_sheets_base_test import GoogleSheetsBaseTest -from mock_credentials import test_private_key, AUTH_BODY, service_account_info, service_account_info_encoded, service_account_credentials, oauth_credentials -from protocol_helpers import catalog_helper, check_helper, discover_helper, read_helper -from request_builder import GOOGLE_SHEETS_BASE_URL, OAUTH_AUTHORIZATION_ENDPOINT, RequestBuilder, AuthBuilder +from .custom_http_mocker import parse_and_transform, CustomHttpMocker +from .entrypoint_wrapper_helper import check +from .google_sheets_base_test import GoogleSheetsBaseTest +from .mock_credentials import test_private_key, AUTH_BODY, service_account_info, service_account_info_encoded, service_account_credentials, oauth_credentials +from .protocol_helpers import catalog_helper, check_helper, discover_helper, read_helper +from .request_builder import GOOGLE_SHEETS_BASE_URL, OAUTH_AUTHORIZATION_ENDPOINT, RequestBuilder, AuthBuilder __all__ = [ diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index c16021833ec8c..168f0d3833caa 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -21,7 +21,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from conftest import GoogleSheetsBaseTest, AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info, AuthBuilder +from .conftest import GoogleSheetsBaseTest, AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info, AuthBuilder _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 42412d9bccea0..a5dc098aa678a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -17,7 +17,7 @@ from airbyte_cdk.test.catalog_builder import CatalogBuilder, ConfiguredAirbyteStreamBuilder from airbyte_cdk.test.mock_http import HttpMocker -from conftest import GoogleSheetsBaseTest +from .conftest import GoogleSheetsBaseTest _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 4e2a0d2c98b84..7d900416385e6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -33,7 +33,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from conftest import GoogleSheetsBaseTest, oauth_credentials, service_account_credentials +from .conftest import GoogleSheetsBaseTest, oauth_credentials, service_account_credentials _SPREADSHEET_ID = "a_spreadsheet_id" From be9b645f01a9a2002e9e79347e87b826044ffa89 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Wed, 29 Jan 2025 16:23:39 +0000 Subject: [PATCH 47/63] chore: auto-fix lint and format issues --- .../unit_tests/integration/test_auth_credentials.py | 2 +- .../unit_tests/integration/test_exception_description.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py index 168f0d3833caa..2f0f4a021883f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_auth_credentials.py @@ -21,7 +21,7 @@ from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from .conftest import GoogleSheetsBaseTest, AUTH_BODY, oauth_credentials, service_account_credentials, service_account_info, AuthBuilder +from .conftest import AUTH_BODY, AuthBuilder, GoogleSheetsBaseTest, oauth_credentials, service_account_credentials, service_account_info _SPREADSHEET_ID = "a_spreadsheet_id" diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index 32afee58a10f4..a5dc098aa678a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -19,6 +19,7 @@ from .conftest import GoogleSheetsBaseTest + _SPREADSHEET_ID = "a_spreadsheet_id" _STREAM_NAME = "a_stream_name" From 2d76e00123dcb9824753ad800dc6e2491b2d3683 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 17:54:57 +0100 Subject: [PATCH 48/63] Fix backoff policy --- .../integration_tests/configured_catalog.json | 2 +- .../integration_tests/expected_records.txt | 6000 ++++++----------- .../source_google_sheets/manifest.yaml | 8 +- 3 files changed, 2008 insertions(+), 4002 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json index bd4415fdfeb26..0c287f046d0bc 100644 --- a/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json @@ -83,7 +83,7 @@ }, { "stream": { - "name": "Sheet6-4000-rows", + "name": "Sheet6-2000-rows", "json_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", diff --git a/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt b/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt index af37f35133fe6..14d738e1457ce 100644 --- a/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt +++ b/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt @@ -31,4003 +31,2003 @@ {"stream":"Sheet3-two-cols-with-diagram","data":{"ID":"d","Name":"d"},"emitted_at":1673989566000} {"stream":"Sheet4-two-cols-no-header","data":{"1":"2","a":"b"},"emitted_at":1673989567000} {"stream":"Sheet4-two-cols-no-header","data":{"1":"3","a":"c"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1","Name":"HKOYohtoy"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2","Name":"JihPBqabq"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3","Name":"YjYEEtsLL"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"4","Name":"QRKtxKNHe"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"5","Name":"tDqEgpjwL"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"6","Name":"GMlYPSytk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"7","Name":"hSVKuWlkD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"8","Name":"YlMLYUOKc"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"9","Name":"OOxRfvJAo"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"10","Name":"luVGPHYdn"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"11","Name":"vUbvQMGoJ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"12","Name":"JiJSiqUKv"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"13","Name":"MdrigkEkt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"14","Name":"AMEmlFqER"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"15","Name":"RrFAiQYUf"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"16","Name":"zJtQRvMiu"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"17","Name":"MgeqSGwtm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"18","Name":"rzxHSNLux"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"19","Name":"WxXpvXKje"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"20","Name":"VayzeSoOG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"21","Name":"shNMKJSFk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"22","Name":"IoXbkhjgb"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"23","Name":"ciVIRhGKE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"24","Name":"BYnlmflXd"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"25","Name":"QVBwnHxsk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"26","Name":"OYEHrZzFg"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"27","Name":"OKiIWkcWj"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"28","Name":"tssxsiFSB"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"29","Name":"cAqTbDugy"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"30","Name":"vwOHAaGUS"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"31","Name":"yLJTYmwPG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"32","Name":"PdnatTOcC"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"33","Name":"JitiDwXLK"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"34","Name":"wfgvOxWqE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"35","Name":"MbgKHaSZn"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"36","Name":"NPZUaAjmd"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"37","Name":"xCawJPKkL"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"38","Name":"gLLCIOAFG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"39","Name":"axDrOVmhq"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"40","Name":"SMBhktbfO"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"41","Name":"HajpaJYIH"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"42","Name":"MYVrEjFwJ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"43","Name":"NOaXaLnVH"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"44","Name":"qJGAsykEJ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"45","Name":"XVuaIakAH"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"46","Name":"ZicCntsxl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"47","Name":"HwLMPpJFr"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"48","Name":"EXCEvEsLi"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"49","Name":"ebhjldgcw"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"50","Name":"jAhvsbWfj"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"51","Name":"vfxRHAVkv"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"52","Name":"LlDRgmdiT"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"53","Name":"kkFKKqUBF"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"54","Name":"szetlOliM"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"55","Name":"MqSGUVyql"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"56","Name":"TtiKoaiXS"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"57","Name":"dOhpxZIBX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"58","Name":"ctNLZziAo"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"59","Name":"PuhmFaNCC"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"60","Name":"zguEkPvBU"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"61","Name":"VYaVyHsXm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"62","Name":"uMDveQluH"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"63","Name":"izjzfIaGT"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"64","Name":"wdwwSLEZG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"65","Name":"NdGicRlpP"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"66","Name":"RajkplGtT"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"67","Name":"VWdqzbjnZ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"68","Name":"rQrafxMdQ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"69","Name":"ZKVDSBOgj"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"70","Name":"HiKoloWcd"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"71","Name":"ALLfFoYPe"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"72","Name":"JSntTjGnA"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"73","Name":"vqChVrQJE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"74","Name":"HRztSHIPb"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"75","Name":"fVtUjdgfw"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"76","Name":"KACCbqcMk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"77","Name":"vNMalGlEk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"78","Name":"pbKBeeJDk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"79","Name":"tjjuCnxTL"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"80","Name":"DmblYorPx"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"81","Name":"jGZifaptY"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"82","Name":"wNAWPZxoo"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"83","Name":"DgcmJfLsw"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"84","Name":"mCpIoKNKZ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"85","Name":"bxHduXTnh"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"86","Name":"akTvwTNVs"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"87","Name":"UiEKKTWII"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"88","Name":"nCcsMIbrP"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"89","Name":"CbRHYaOVe"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"90","Name":"wqunudifE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"91","Name":"HQnkdqILK"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"92","Name":"BZvVDmBTe"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"93","Name":"HoTywmlnm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"94","Name":"YAOCdAFJB"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"95","Name":"StQsiYOwK"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"96","Name":"LkLbdTviV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"97","Name":"dumzUMEzs"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"98","Name":"SzaoCCpUa"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"99","Name":"DTYQLMcyo"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"100","Name":"XxSDqMYIV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"101","Name":"BTtvdXYjK"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"102","Name":"UzTjvfUyj"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"103","Name":"ZYPAHbHOs"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"104","Name":"TctfQHhZW"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"105","Name":"idClfQSuq"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"106","Name":"psRmjVUBl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"107","Name":"JmDVZFLbm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"108","Name":"hLeJTYGEh"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"109","Name":"DujuNeBMN"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"110","Name":"MfrTsXCeE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"111","Name":"SxRpjXXJV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"112","Name":"byEvGfeqh"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"113","Name":"lCGKFHUMV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"114","Name":"WomwRnEnG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"115","Name":"jBXYkjydD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"116","Name":"aLjlzoSRn"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"117","Name":"WGZpHbppn"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"118","Name":"EvOumyHSn"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"119","Name":"VvRPwCfkG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"120","Name":"MEMGPIPLm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"121","Name":"yayAbistG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"122","Name":"SXpIRBPEt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"123","Name":"ZsECkwZQU"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"124","Name":"FfHtePhxu"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"125","Name":"XAJLZeSEX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"126","Name":"VAhvkZoBD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"127","Name":"LNSKZOvTd"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"128","Name":"MZENkhJbA"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"129","Name":"RssQutiIr"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"130","Name":"NAmqJxXzV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"131","Name":"VyZhbDgmm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"132","Name":"VIAGxKJAc"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"133","Name":"xLwWBPafq"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"134","Name":"OAdsGGrWu"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"135","Name":"NHbBfNmNY"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"136","Name":"FpYmmMCds"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"137","Name":"MBNcBNkOm"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"138","Name":"mZNfRuQqA"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"139","Name":"IFMOQtGvT"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"140","Name":"oGfDTOtcD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"141","Name":"iQhNQQSCt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"142","Name":"TVOKVBMiW"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"143","Name":"ztKnIyqkb"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"144","Name":"WkKeqmkRW"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"145","Name":"yZmAWvlAF"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"146","Name":"YtPtRAjcl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"147","Name":"xbMpOYzmM"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"148","Name":"KbiRNYIUq"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"149","Name":"SyMaBAcqP"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"150","Name":"ntJRYHYYf"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"151","Name":"sDbHtkpky"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"152","Name":"boWFTZwbW"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"153","Name":"PQlJAZiBl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"154","Name":"AWfLUJSKv"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"155","Name":"ESOrNWtDG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"156","Name":"YabNZLklp"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"157","Name":"umeoHMJop"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"158","Name":"QpPWXrLMD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"159","Name":"jPqcnnzDD"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"160","Name":"rrqjeFIif"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"161","Name":"nBdfwZCIy"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"162","Name":"ShaYHXaHO"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"163","Name":"hdHTHpFvi"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"164","Name":"BKMPANWbA"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"165","Name":"WpmvKMrVt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"166","Name":"fHuRkdsKt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"167","Name":"ZCOqWurcE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"168","Name":"wBBnwaREX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"169","Name":"LBMZhpQDK"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"170","Name":"oBkkzbKBM"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"171","Name":"ZUDHkoqhk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"172","Name":"HJKFXofTE"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"173","Name":"MrbOWRJVZ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"174","Name":"eJESUxMkg"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"175","Name":"fXxfcZAVd"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"176","Name":"TXKKvLDuy"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"177","Name":"ESfgSDoEj"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"178","Name":"VVVWgRqkW"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"179","Name":"ijsAHEZTk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"180","Name":"WpoqeBSDo"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"181","Name":"xZNgSHVZt"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"182","Name":"IaeSdRGIX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"183","Name":"RaKyMUsxZ"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"184","Name":"byJUNsAXO"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"185","Name":"JWstJraRx"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"186","Name":"VkBVcPNDf"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"187","Name":"LodIrsRkg"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"188","Name":"IiwdqKeYk"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"189","Name":"JjquTEFEU"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"190","Name":"iBsbkOTIR"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"191","Name":"rhonaHtoX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"192","Name":"MPFvRWwHl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"193","Name":"XcjrRANZl"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"194","Name":"GCglqARDI"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"195","Name":"OxkTkIAnV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"196","Name":"OclfysquS"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"197","Name":"skzCKYUgY"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"198","Name":"EAUvKCGHR"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"199","Name":"ByyqjnbPB"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"200","Name":"cYZiSZIrO"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"201","Name":"ofUUsfZyx"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"202","Name":"lcYHmFMhV"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"203","Name":"wJOEfNdXX"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"204","Name":"sTytgGDEb"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"205","Name":"wNCrySgoi"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"206","Name":"nlhuvWuQG"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"207","Name":"rlPwuVnpN"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"208","Name":"iiYjVxacA"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"209","Name":"BwxIbRMdr"},"emitted_at":1673989567000} -{"stream":"Sheet6-4000-rows","data":{"ID":"210","Name":"RORMzlwJE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"211","Name":"KzsZhjaJa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"212","Name":"NlPWoTJmu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"213","Name":"ZCeGBASxO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"214","Name":"woNEKMcIu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"215","Name":"rmTGDMfrs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"216","Name":"cFEenHOsx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"217","Name":"NqpuPTKKm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"218","Name":"ExRVTviEg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"219","Name":"GsDxKNIgm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"220","Name":"dLivYHQiC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"221","Name":"gqJEwdpVb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"222","Name":"CsGWPAsDK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"223","Name":"MyooWzeER"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"224","Name":"MBpwxPGUN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"225","Name":"MlKbPgJVC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"226","Name":"OrjMKpeFJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"227","Name":"hwcVeaBGP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"228","Name":"ZlrwSMXYh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"229","Name":"emmcHtCqq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"230","Name":"DhLJwRjID"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"231","Name":"VQXYYKsci"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"232","Name":"qaxpQbyJx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"233","Name":"cEXmTcgkE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"234","Name":"TQqXukneS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"235","Name":"msTLYqVDG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"236","Name":"pHcYGTLrC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"237","Name":"VXjGBwQIF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"238","Name":"zqqVIgZmy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"239","Name":"FSrJGxVWD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"240","Name":"YeDrbzaGC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"241","Name":"zwtUTcMyq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"242","Name":"ioxTUTxrf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"243","Name":"WfWSfCkmP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"244","Name":"SNSgzxzXg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"245","Name":"laVCTkACS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"246","Name":"wfSFulPQl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"247","Name":"MsYNFWlaz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"248","Name":"VVzdpqXgY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"249","Name":"GHSlPRtLM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"250","Name":"LYiRGrkrz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"251","Name":"QklBlVoyQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"252","Name":"hyMTVHbuT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"253","Name":"YFwOmpLoZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"254","Name":"qVJLPdcxn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"255","Name":"XLkkMlnXp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"256","Name":"QkvcbmBgJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"257","Name":"FiixlYrIv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"258","Name":"ZWmsdohhg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"259","Name":"MYfvWudav"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"260","Name":"tKZtsXPIx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"261","Name":"ZarREiATF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"262","Name":"jDKpKSCZG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"263","Name":"INVnRqeZQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"264","Name":"vHmpbLLBt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"265","Name":"aPlRHtmmp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"266","Name":"phcnyBpJs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"267","Name":"ppjzwpVmz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"268","Name":"jMqzCwoSq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"269","Name":"PBDqthrYx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"270","Name":"gfeYcZXhb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"271","Name":"urZOuPrfW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"272","Name":"yhpITYLgv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"273","Name":"LPLtApRLN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"274","Name":"sXtnIFxJH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"275","Name":"bUMGorrKO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"276","Name":"lcDeVjbMr"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"277","Name":"pwUKeXzyt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"278","Name":"QLBnLJKhc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"279","Name":"eTJtnXFez"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"280","Name":"gXCVGkMfW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"281","Name":"JpmHpfYOL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"282","Name":"OEzPvvyYn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"283","Name":"BxhOlZjsc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"284","Name":"CMwZNQokF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"285","Name":"VzhxSKSgc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"286","Name":"HDEDArrcV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"287","Name":"oLKyKtZxD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"288","Name":"lquLSGnjh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"289","Name":"CycNjOUYF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"290","Name":"AzuVbTuyd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"291","Name":"cUNvTQyPJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"292","Name":"rUGFDFGSe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"293","Name":"NhrjSBjDx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"294","Name":"xYatsZOiy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"295","Name":"LtnWeamBh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"296","Name":"DRFxVOUEM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"297","Name":"WlDPjNmSV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"298","Name":"UQPVwpmAP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"299","Name":"pZfHsWhcp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"300","Name":"lfypxATlf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"301","Name":"yzQLniaXM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"302","Name":"yzkYrMZfE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"303","Name":"jdQQfPocO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"304","Name":"YPyrDClLz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"305","Name":"zhxGHFTve"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"306","Name":"ychyaNMtp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"307","Name":"XhpsfGgpF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"308","Name":"lolbURYcW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"309","Name":"IfbRGrrQZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"310","Name":"mehfuZacw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"311","Name":"BlqFvJQHW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"312","Name":"ZYTrVZYuf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"313","Name":"cjRazTbFZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"314","Name":"GaVgqAqfJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"315","Name":"CyEmWFnww"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"316","Name":"mkxaZJeZc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"317","Name":"PjhmnGPtm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"318","Name":"kWwiKohgf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"319","Name":"NNbxUfISc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"320","Name":"nKGABysXI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"321","Name":"dPjFlZZph"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"322","Name":"pRAFKBoJd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"323","Name":"cYitflbQC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"324","Name":"vUTRaXOoM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"325","Name":"OqRoYPDhl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"326","Name":"VpqzAaLtD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"327","Name":"PnZepjSUd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"328","Name":"DUrGcxNVo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"329","Name":"NBQtCdTSj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"330","Name":"cWCjPNzpQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"331","Name":"lHIXIadUs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"332","Name":"oqpCeRKVx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"333","Name":"ctBSuXWyn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"334","Name":"tYpcsHixA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"335","Name":"VcBhHdqzQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"336","Name":"fAwCtjECq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"337","Name":"vfFMyzUwU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"338","Name":"UTrmoEfAG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"339","Name":"NIuNNEGgl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"340","Name":"QfVEDUddB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"341","Name":"WrGjEptQd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"342","Name":"WOsMVQcrE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"343","Name":"myPkSbUAt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"344","Name":"mLlCSDRvd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"345","Name":"tLkkxQECm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"346","Name":"LKKVdStiP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"347","Name":"jUlspaMCf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"348","Name":"hteUZjGYG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"349","Name":"JKqhqBveO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"350","Name":"rjEiNZfvv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"351","Name":"bQBHfyAoh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"352","Name":"oOmYiqxOL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"353","Name":"ubFqSuHyK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"354","Name":"gLRZWccdO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"355","Name":"BFhkfPOBB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"356","Name":"dZnIsdmSC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"357","Name":"eBUyEYidA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"358","Name":"QawwEZFue"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"359","Name":"SNhQeRZtE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"360","Name":"cXXeXTwIR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"361","Name":"VqeYGWhHj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"362","Name":"PRNmOTFQT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"363","Name":"ouksKBUoo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"364","Name":"AVHyzoidp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"365","Name":"mtBKNuLDw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"366","Name":"XgfwBAFIT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"367","Name":"nZObsdLqA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"368","Name":"ueNTtibEM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"369","Name":"SOdbXjaBt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"370","Name":"SKmlaGriU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"371","Name":"CwWvXhgHm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"372","Name":"hAfPCxrMa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"373","Name":"NvFKEuExd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"374","Name":"WUpPLDrDu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"375","Name":"nxzniiRrI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"376","Name":"mxFhwxWEs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"377","Name":"uEVWhhjhx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"378","Name":"LRBoIyotF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"379","Name":"eRfyYlCXN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"380","Name":"oWsGQSpyy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"381","Name":"gDFEggyEB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"382","Name":"iAlcMymyk"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"383","Name":"HfUoRYPql"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"384","Name":"UDEzylwrU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"385","Name":"aZyaROHnX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"386","Name":"PtClOxnYE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"387","Name":"zUKzFZaGB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"388","Name":"pxPzcUrir"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"389","Name":"lFxTnCqhv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"390","Name":"kAxkEhgUB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"391","Name":"sXGvDmBtN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"392","Name":"XJLxibbdc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"393","Name":"pMlrfsitQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"394","Name":"yAHduuWNd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"395","Name":"ktYFLraOw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"396","Name":"apjpDCbwI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"397","Name":"KyvMdUahm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"398","Name":"FWXXEAgoF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"399","Name":"EYDrVTpoX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"400","Name":"Wdwlfsfhb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"401","Name":"UbFlVLNDI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"402","Name":"MfVyIgyHG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"403","Name":"RMuPoEEZX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"404","Name":"HLTsAfIAl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"405","Name":"NvyhHTedB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"406","Name":"GvILrNmWL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"407","Name":"uTcVfaVLS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"408","Name":"BMwZwgYTf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"409","Name":"gOVolsFMR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"410","Name":"FjyTyBMal"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"411","Name":"jBFedJlPd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"412","Name":"XjGJlxYtF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"413","Name":"IUpHWyqHR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"414","Name":"MUezdBDim"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"415","Name":"GSIYCMUkV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"416","Name":"GzYJXbCYd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"417","Name":"axXnhfXDY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"418","Name":"lnDeqUbNN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"419","Name":"ASNdakBlM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"420","Name":"lairvePQh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"421","Name":"fyhwyykDc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"422","Name":"FEsqGnKwP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"423","Name":"PXEWMdFHZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"424","Name":"suyduatoX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"425","Name":"FDjJSUBjB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"426","Name":"OVhokHMJb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"427","Name":"jvTrHMRSr"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"428","Name":"ULZJrjAml"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"429","Name":"AfQFFeoFe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"430","Name":"oKdllGSmF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"431","Name":"qcjfkLUaJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"432","Name":"DgTLilpia"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"433","Name":"EAhZKFFbN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"434","Name":"dyXritsuS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"435","Name":"wtHAoKVVD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"436","Name":"OBAhRtXQg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"437","Name":"VkHMhrVdp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"438","Name":"vdvlaUEHt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"439","Name":"favPZaeUF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"440","Name":"CUhfgzsHK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"441","Name":"XrZTVMTkF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"442","Name":"UuoJWLnWx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"443","Name":"cViYKtoXZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"444","Name":"QRLsshDYB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"445","Name":"egAgcHUCs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"446","Name":"IiznJNLvS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"447","Name":"JPdTIhBXD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"448","Name":"YQPrytaky"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"449","Name":"WTFIrECDH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"450","Name":"GDarIcfiD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"451","Name":"mcfJLwGzC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"452","Name":"MMNRQrYpz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"453","Name":"YjOIWuGIR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"454","Name":"HjKPcbbnX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"455","Name":"ayvtscZPb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"456","Name":"aMdUjeBPK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"457","Name":"pYtsMsNIQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"458","Name":"ZwKDQXTpp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"459","Name":"nFwpcKkUb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"460","Name":"BbmcaTZFY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"461","Name":"WquQFuOYK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"462","Name":"eufnIZTSW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"463","Name":"rYblmHioI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"464","Name":"vzKatFHgp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"465","Name":"yULkpvJqu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"466","Name":"KLZPGjraI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"467","Name":"QIvseYYFK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"468","Name":"GQhaPCOXv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"469","Name":"wLUSgVyzF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"470","Name":"wrrJrvRtu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"471","Name":"xneVfJWre"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"472","Name":"nqsfWKTYu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"473","Name":"qUeCbKFZa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"474","Name":"icYVJmJUa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"475","Name":"PPRmPzhZL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"476","Name":"DzgiubhWv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"477","Name":"WBAKITHSf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"478","Name":"NLfGKrIKg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"479","Name":"KuwnUxoYE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"480","Name":"ichNzxmZV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"481","Name":"NBNFxstsb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"482","Name":"EBYBjBeGX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"483","Name":"IHShetWlt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"484","Name":"NRydquyvW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"485","Name":"MgIozOVzw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"486","Name":"JxNxmdmnn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"487","Name":"CwbPSdAcp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"488","Name":"WOitYWbSe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"489","Name":"TBGWGpHig"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"490","Name":"gNrEhCtYo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"491","Name":"mEgXbuQta"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"492","Name":"FhNaGXDVU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"493","Name":"xRhpLOWAz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"494","Name":"rhsLUpuhw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"495","Name":"ulcDdKbeH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"496","Name":"jNPOwLwZO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"497","Name":"tWqZbbRMX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"498","Name":"ctxUwHsWT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"499","Name":"GkfDDiWKn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"500","Name":"aQUkJHaWI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"501","Name":"gYJBlqwIR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"502","Name":"cjoyuyLdE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"503","Name":"vtFdeRXUP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"504","Name":"mYcbdDSkz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"505","Name":"oULxlkSqF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"506","Name":"RWYzjEvVe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"507","Name":"YEbeWcaVg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"508","Name":"dzhPIyJEM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"509","Name":"QZGfqKnTj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"510","Name":"lCxnXWNUv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"511","Name":"HXdMhzuNU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"512","Name":"lOZKDbwKU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"513","Name":"kEwpTFlDo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"514","Name":"NSfAemXNI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"515","Name":"djkymHTfh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"516","Name":"JilWrRkhK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"517","Name":"SGAocdUyj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"518","Name":"xaDREGdRu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"519","Name":"jJoYHrTRN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"520","Name":"JjpUSfynO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"521","Name":"SuCUlphSh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"522","Name":"ynNPzUJBa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"523","Name":"aYrFExeYA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"524","Name":"pwPNmkpLE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"525","Name":"eqQERmIXb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"526","Name":"PAprjISIQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"527","Name":"YKGfczcPc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"528","Name":"FSyCbwqAW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"529","Name":"uIRXcGSNQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"530","Name":"dQHdUkhCJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"531","Name":"TYlsbwhBN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"532","Name":"gdzOUiYWy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"533","Name":"soENcccUu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"534","Name":"JfmwwXuVL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"535","Name":"odWirIeZd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"536","Name":"tKfngZjGu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"537","Name":"riWiudFqM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"538","Name":"kwlPSWBnE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"539","Name":"xpCSTaKQA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"540","Name":"zQvUSaEVS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"541","Name":"SbHnLdnyN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"542","Name":"idkCmgVkg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"543","Name":"TQhuuMlXn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"544","Name":"EFOkJMlbJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"545","Name":"GSMWnocZC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"546","Name":"BEoLEOonT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"547","Name":"UExABrxKH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"548","Name":"KDEEKahcu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"549","Name":"nHTFxNjdS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"550","Name":"mtkHihxnZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"551","Name":"HEvciDGwv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"552","Name":"vPbchVjSU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"553","Name":"HcUoucRRP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"554","Name":"rtEvjkIkN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"555","Name":"bkLeBAbOb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"556","Name":"XEZuaMMET"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"557","Name":"nSsYzFsCq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"558","Name":"rwsPtfdDu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"559","Name":"jvyhuWRNr"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"560","Name":"ovgfzOVLQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"561","Name":"kavkLzAeR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"562","Name":"bMuGXSpVP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"563","Name":"cWPFIFBGQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"564","Name":"MpyYHHCHd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"565","Name":"SSjAHDKdM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"566","Name":"nvZjyozhj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"567","Name":"hhNNrsxjr"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"568","Name":"ZhCVNPGdU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"569","Name":"NIDwizdJT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"570","Name":"DBVLlhuKH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"571","Name":"QltnqyHVf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"572","Name":"WakCbnssL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"573","Name":"CbmRlAmeX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"574","Name":"uzJfwOozL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"575","Name":"dTeqiBEDL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"576","Name":"QaEaKbOMd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"577","Name":"ZPlVtEyoo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"578","Name":"cCkIDqWjS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"579","Name":"hXPetJMnt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"580","Name":"PMDruxvIe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"581","Name":"msyqrGgsl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"582","Name":"ZsRbYblgV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"583","Name":"GhtigBbhc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"584","Name":"aWGjzQqRK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"585","Name":"xMYNlyLue"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"586","Name":"iaXOnHSaG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"587","Name":"FcDrrVHTI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"588","Name":"gcKWUYjfA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"589","Name":"NMkhOdilo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"590","Name":"yixKusUri"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"591","Name":"GCxRXPucX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"592","Name":"GhPuXkBLP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"593","Name":"XxsgZasQF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"594","Name":"ECkgjIakd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"595","Name":"PmKzzHAbW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"596","Name":"PooFCXSha"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"597","Name":"IAWxmSdph"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"598","Name":"zgNcvsVbc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"599","Name":"ghAKGRsSG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"600","Name":"XfgLrIrgH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"601","Name":"exMKlPilA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"602","Name":"ADBVeCTET"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"603","Name":"oHfUUrJQV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"604","Name":"gyVFtlQNa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"605","Name":"gRNafQqxj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"606","Name":"zmcdDyqMz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"607","Name":"HuyuOgkcx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"608","Name":"lPPyIaBnV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"609","Name":"iPnReofbM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"610","Name":"BjEmICbwd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"611","Name":"qAogkLkLZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"612","Name":"bIeyglwtx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"613","Name":"SQfLCNMOQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"614","Name":"VyvGvFjkp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"615","Name":"flMeymTRL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"616","Name":"omgifpcnm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"617","Name":"FSctjvHzx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"618","Name":"FWFMbWDfM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"619","Name":"upmedQraw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"620","Name":"qsADkxlEm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"621","Name":"bcNMKrBOF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"622","Name":"DckRXLrNx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"623","Name":"TgeUJtewj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"624","Name":"kkytXeMgi"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"625","Name":"kiauowHFy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"626","Name":"WjtHegFIH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"627","Name":"YrFhJvROA"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"628","Name":"CPuvRJusp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"629","Name":"CLfDODMDe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"630","Name":"WXSAPvQkn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"631","Name":"VZiRIPhtv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"632","Name":"uzYxbzBJV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"633","Name":"YbkpJAOhd"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"634","Name":"SjAngTuAX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"635","Name":"zvpAWpzCI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"636","Name":"AySIqrhLM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"637","Name":"BukcEdCjG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"638","Name":"UtZbeozSg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"639","Name":"GzYTRUzbI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"640","Name":"wtKVOwmUQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"641","Name":"TjZOFLxxp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"642","Name":"kwLhXYoHt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"643","Name":"kwhSPuGwH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"644","Name":"BZmKyQaQZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"645","Name":"lFDzBqxhS"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"646","Name":"MOmpFzPpL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"647","Name":"PffrmIBlI"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"648","Name":"alaQrOKnW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"649","Name":"BrMdOmKan"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"650","Name":"NJgDRcZls"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"651","Name":"MvBzOrQjp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"652","Name":"dCUKrmvJZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"653","Name":"imMhFQxYg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"654","Name":"YAYijELnC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"655","Name":"nItLYhxla"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"656","Name":"KkdXFFbXN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"657","Name":"peGMVTloQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"658","Name":"yEJsFbOuE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"659","Name":"YgqMZpbiF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"660","Name":"lXZDUFgta"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"661","Name":"pqgmKNyrn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"662","Name":"kePxpVuAs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"663","Name":"EfGekUEix"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"664","Name":"nJoLBPhKM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"665","Name":"DPnhBzPDM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"666","Name":"xMwlbHevO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"667","Name":"ChXEbIzPF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"668","Name":"tWoPfjdDU"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"669","Name":"MUGUguMXc"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"670","Name":"hwQTSPVhq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"671","Name":"bRGxHwEQb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"672","Name":"hOHblXJsp"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"673","Name":"CzktbaOBs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"674","Name":"GKNpfTAbh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"675","Name":"RtoTLOZLY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"676","Name":"mTrbEEFoa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"677","Name":"cxBqNgIUG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"678","Name":"ksKEuZrMs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"679","Name":"zIyVZkgUD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"680","Name":"MYwtQYufn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"681","Name":"carwjygVE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"682","Name":"ltyncmwcb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"683","Name":"bGcmRLwUx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"684","Name":"gfwjttXcZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"685","Name":"nudaBNWHO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"686","Name":"IwhipLQru"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"687","Name":"qpIccTGMf"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"688","Name":"jufTMBXbh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"689","Name":"oiRZvfwXD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"690","Name":"wDzouuGQD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"691","Name":"DcMLGnnnV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"692","Name":"hFftzyKtW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"693","Name":"KfXyVUdOR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"694","Name":"AFXkxwScv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"695","Name":"AgLfJVNUP"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"696","Name":"zuRAffYIx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"697","Name":"TrfoWgvna"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"698","Name":"miFNlBbRe"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"699","Name":"ompyMvlyX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"700","Name":"DXbhdbAHH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"701","Name":"HWxxpBWFk"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"702","Name":"XodPvXvJz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"703","Name":"mrqBYOFiB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"704","Name":"jYJPHeLat"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"705","Name":"LZIwFKdFO"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"706","Name":"mijJYLPOQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"707","Name":"uhaqjFTgR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"708","Name":"bYGIncQdV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"709","Name":"XUTBDNBGW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"710","Name":"QdSJBYyhD"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"711","Name":"yBgQHZHae"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"712","Name":"mIKLhrEZs"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"713","Name":"sERNqyjNJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"714","Name":"rMMEQtrEo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"715","Name":"iFiOVXfiL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"716","Name":"cLQPMINvy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"717","Name":"oppwHqswT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"718","Name":"tzIOJHyYi"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"719","Name":"IYfesRLBg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"720","Name":"ipWCAMoqk"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"721","Name":"iWXmcGWMw"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"722","Name":"yiSkPPWBx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"723","Name":"VpHrGfmkj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"724","Name":"TMlUtybbl"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"725","Name":"UZCAhftOv"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"726","Name":"wYLrPgMUT"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"727","Name":"LWxxgQXGB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"728","Name":"iEqWPUPYV"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"729","Name":"MXpBNTBjR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"730","Name":"XTnMspmtJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"731","Name":"lINCgPkUo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"732","Name":"BAnIGGKku"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"733","Name":"aguDqZkRn"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"734","Name":"siMBcuNhu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"735","Name":"ykjPcViRR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"736","Name":"jOjSTICVK"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"737","Name":"zUdhMTrdJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"738","Name":"bjeNLykak"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"739","Name":"CRgbVyrYt"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"740","Name":"PLtTFUhwq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"741","Name":"pVjpAnuUW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"742","Name":"yDdhRnxwG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"743","Name":"UiDpXwKWj"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"744","Name":"QWBWyuuXm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"745","Name":"uvIMjcbYQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"746","Name":"LRIrjqAFG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"747","Name":"ThoqoTLNb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"748","Name":"sRIiPHguk"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"749","Name":"yDxeePTsg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"750","Name":"nEkicHOXW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"751","Name":"uYyGcsNzF"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"752","Name":"OTpbebGUQ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"753","Name":"bLtbbLKrY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"754","Name":"vDMFGqHkX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"755","Name":"QWMVpafIX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"756","Name":"rUxFvEYTC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"757","Name":"nKJxrOEmu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"758","Name":"vmedzzXdg"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"759","Name":"rsaiCBcVR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"760","Name":"ITnJdrzPH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"761","Name":"IuCKRdJLo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"762","Name":"hHHNFjyau"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"763","Name":"XAqSEEuvW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"764","Name":"CAbbZfQwX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"765","Name":"PNvNOnGNH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"766","Name":"tTtsxWOPL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"767","Name":"ChusyBGPM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"768","Name":"ikAsCcnGq"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"769","Name":"PxVIpoexx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"770","Name":"fOKuEaPdZ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"771","Name":"VZGgFXqBm"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"772","Name":"lQEUJOFvE"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"773","Name":"MCbjToghz"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"774","Name":"BHhxrblFN"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"775","Name":"IdSTPvWrB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"776","Name":"PJHDJHEPr"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"777","Name":"KAiEJhGvJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"778","Name":"wfupKtmws"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"779","Name":"IkVgPTzNL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"780","Name":"mxYccwXtL"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"781","Name":"mpxuVkQYx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"782","Name":"zmOpgaKor"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"783","Name":"YjHmkyADW"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"784","Name":"veYSMCfMb"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"785","Name":"jHDwCOSKR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"786","Name":"PBHcnvhyo"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"787","Name":"MasRcOnJh"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"788","Name":"aziZoBwkM"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"789","Name":"sprvcIJCu"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"790","Name":"cFTJVsVYC"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"791","Name":"wtDZQuYZk"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"792","Name":"MUSwtTpaY"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"793","Name":"jWjmVTTnJ"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"794","Name":"XzHekLjEx"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"795","Name":"yJSlKezcR"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"796","Name":"qITGsxIil"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"797","Name":"EXZuEqGHy"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"798","Name":"hTJwuTXop"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"799","Name":"UxjsZfhqB"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"800","Name":"pxJvNMzDH"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"801","Name":"uIVOzzfHa"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"802","Name":"yTGIsFWyX"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"803","Name":"rKKMNpyiG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"804","Name":"LcbtgoooG"},"emitted_at":1673989568000} -{"stream":"Sheet6-4000-rows","data":{"ID":"805","Name":"VgxUyhGdi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"806","Name":"aEbPtmFmu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"807","Name":"UtBgGUWVs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"808","Name":"pgXgbbouK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"809","Name":"QqAIFsIeq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"810","Name":"lIDEEEvZE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"811","Name":"KetciCSpw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"812","Name":"EyVqliLVu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"813","Name":"DOYfuXDZS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"814","Name":"wZZiMcJgj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"815","Name":"fGttTgUNi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"816","Name":"skXVCivmf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"817","Name":"OVPLIObhl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"818","Name":"BIiBmPstp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"819","Name":"EKAqRsVfO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"820","Name":"cpGoabbWs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"821","Name":"mvKhqFMsg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"822","Name":"fMQUuMkhR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"823","Name":"xfKwdZWUx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"824","Name":"LjzluzMaE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"825","Name":"qAaLCEaUk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"826","Name":"jebEhKSGU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"827","Name":"iYhxlUWHZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"828","Name":"FMdoXPovN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"829","Name":"YMFJwUuZw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"830","Name":"CyKLPwhDj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"831","Name":"TkhkaDUHS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"832","Name":"vLXzJfEAk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"833","Name":"ksRBSfAxr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"834","Name":"BpXqHILRC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"835","Name":"VPhegaHXd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"836","Name":"oKYiRJERt"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"837","Name":"aMPpcBDcC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"838","Name":"nIvbNWuPK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"839","Name":"jDxKqBGXU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"840","Name":"OcGTmjDlj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"841","Name":"kkAIaNSHx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"842","Name":"zlvdSkICV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"843","Name":"GjPkyNWFd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"844","Name":"jlUsyRQIJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"845","Name":"tbUbcXyXv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"846","Name":"PKANXUrID"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"847","Name":"hKqaTpuWv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"848","Name":"VhAVxreAL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"849","Name":"AvJADzqap"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"850","Name":"exMtaSqHF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"851","Name":"KZjaaCoUA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"852","Name":"smgwMTMDv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"853","Name":"utukeevIN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"854","Name":"LIIpQLMQz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"855","Name":"cdsydJADF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"856","Name":"HgWPegBLp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"857","Name":"WulhxGPyG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"858","Name":"XJyzNfZnw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"859","Name":"fpiUuWiaM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"860","Name":"vgkrlSFhZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"861","Name":"wPGZdaNHh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"862","Name":"ttYTXjgTs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"863","Name":"JUggTwfeJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"864","Name":"MdXlmqMSN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"865","Name":"KQVuCoxPl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"866","Name":"RHrgXMqhE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"867","Name":"OyhgAzmrs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"868","Name":"yapnDdsXe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"869","Name":"CDghLJWwF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"870","Name":"ZSQAWLAbP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"871","Name":"gyQAIufzn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"872","Name":"mKpQJwkEW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"873","Name":"DoEICtYjV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"874","Name":"eyyOaeDId"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"875","Name":"DVaFYQOje"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"876","Name":"ulkrxLyjG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"877","Name":"VxGeTpHub"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"878","Name":"LFSxoxEWf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"879","Name":"zNPpLdvqp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"880","Name":"hByLYeZmh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"881","Name":"FoyUfJfQB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"882","Name":"fDliVBvJO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"883","Name":"HPpfmjFHv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"884","Name":"RTHynjAYb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"885","Name":"GRyedwRxs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"886","Name":"CHWGLTUJa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"887","Name":"doGHHMuDk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"888","Name":"TOXevEyuG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"889","Name":"ftPDzOeQP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"890","Name":"RTNWxrrfT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"891","Name":"BLBhqLIcq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"892","Name":"EHQsXPcPq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"893","Name":"mZfSOmdCd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"894","Name":"XAgDERrZQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"895","Name":"NbKssWULF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"896","Name":"XwUTKOEHX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"897","Name":"rApSQwJpn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"898","Name":"IFMrQszOV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"899","Name":"dSnJmKdpx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"900","Name":"gUgJexXqR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"901","Name":"rvDJOwPIl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"902","Name":"bXsbfEhvs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"903","Name":"fETUGCiyq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"904","Name":"rphZBIIgK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"905","Name":"tsdtUvdQB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"906","Name":"SXJmdzlEd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"907","Name":"wCTsAHWzA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"908","Name":"LIiNaNGwe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"909","Name":"KDcYsUbUX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"910","Name":"YCYUmlMPY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"911","Name":"yNokcsMlN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"912","Name":"PUlkQogmN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"913","Name":"LGZDfdbTD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"914","Name":"cocfYIYUV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"915","Name":"heByRJARu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"916","Name":"wjaWLQxVY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"917","Name":"vtPRivuRk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"918","Name":"SEwoYfEQb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"919","Name":"PvkkccqIn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"920","Name":"NQXBUVnav"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"921","Name":"FPQFUtpsz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"922","Name":"aIvlLozhX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"923","Name":"GKRixsJSe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"924","Name":"wUdHXiMDL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"925","Name":"QEqlKjEov"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"926","Name":"NtDYDJWJK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"927","Name":"hOXMAiGzp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"928","Name":"wTiMSYWRU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"929","Name":"WFqFPSPzk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"930","Name":"hZzYzwOQV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"931","Name":"LNogdRNVR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"932","Name":"ACyXrUyup"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"933","Name":"PRpSiuMqS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"934","Name":"WMMiSTVAO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"935","Name":"lcWlQKZUE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"936","Name":"AQFwSjriS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"937","Name":"fmImItBpz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"938","Name":"RbDXrftIr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"939","Name":"SNKJxTIzK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"940","Name":"ymPkqWSET"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"941","Name":"QcrSrcFqd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"942","Name":"ExSTDqLQD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"943","Name":"KWLHUzpiB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"944","Name":"kkwMbgegr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"945","Name":"OjAZQkQwl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"946","Name":"nrRWxWVio"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"947","Name":"BbMuoLtTf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"948","Name":"tewJnpUqt"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"949","Name":"TlUNpXLkO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"950","Name":"KYziVFbEx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"951","Name":"aWlpQjaYH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"952","Name":"nrhxQpBkz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"953","Name":"gnxnrNqLQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"954","Name":"SJQpVdDhq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"955","Name":"CJgWupNya"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"956","Name":"XNshhlFqY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"957","Name":"KtaxpqwLa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"958","Name":"FCCGZaYFa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"959","Name":"wjWwBnQuS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"960","Name":"oCYxItqot"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"961","Name":"blaKBvMvQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"962","Name":"xAxODhHyQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"963","Name":"zogAXuJfY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"964","Name":"vHSpzOqRM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"965","Name":"wrrpQHpsj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"966","Name":"cBCLRdAsp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"967","Name":"mTncrumWf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"968","Name":"hVYCQIIgh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"969","Name":"LMTZOMqio"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"970","Name":"QjPhxpGKT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"971","Name":"cOKjBbYVq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"972","Name":"WBvsXJKyu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"973","Name":"wWYWRkVsT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"974","Name":"wJlmOIiFn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"975","Name":"drzgKTKxX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"976","Name":"LigAewtUG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"977","Name":"vSGCKUJRM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"978","Name":"OTHOCNtFC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"979","Name":"CHREYUnqT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"980","Name":"kkQtElfLu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"981","Name":"eRVXuHcSg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"982","Name":"EIcbaknCi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"983","Name":"NkMDnhyGy"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"984","Name":"eUJbSYchR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"985","Name":"RmqUKhSVD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"986","Name":"ILvHoeoBQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"987","Name":"jlJbRVEWc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"988","Name":"UiXKmWZZL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"989","Name":"rntHkWTLl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"990","Name":"pwWoSZCKI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"991","Name":"dlaYjyDbm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"992","Name":"bFzXSPkBY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"993","Name":"OBVFJFFls"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"994","Name":"wiJgETdXK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"995","Name":"lvjiEqpId"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"996","Name":"QUBlMjVpP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"997","Name":"fZZGDPomq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"998","Name":"oBmdqoMSH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"999","Name":"SGtMmBQDu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1000","Name":"KOAzNypSj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1001","Name":"bxnyqzZVb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1002","Name":"FvXpfgaPP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1003","Name":"MdnuKHWNK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1004","Name":"AyPOhmhTl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1005","Name":"BlZHCYSNQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1006","Name":"XZHLTEAns"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1007","Name":"yHmUijbYU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1008","Name":"ZkuWiHwLW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1009","Name":"qYJHxaLHP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1010","Name":"QoWCXjsFP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1011","Name":"NwMUHUOUz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1012","Name":"zRLPidwIM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1013","Name":"zbVbJahJh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1014","Name":"csPzXmRqa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1015","Name":"OjcnMrXtZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1016","Name":"tlogkASTl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1017","Name":"JpqYbbtXL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1018","Name":"NCnCJoInY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1019","Name":"iHZsVIqvA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1020","Name":"WfhDrKSck"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1021","Name":"cyyfduQJO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1022","Name":"IPJpkbWCK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1023","Name":"rXRyiqXsg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1024","Name":"qCZtetBRK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1025","Name":"utbVGNfWs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1026","Name":"MKcskAmSn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1027","Name":"rLQsJNDbF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1028","Name":"cqYPqToub"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1029","Name":"EElBChJbl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1030","Name":"GHvdYErIh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1031","Name":"kVcHsHOOO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1032","Name":"UfhbtDigl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1033","Name":"EmwdYVAiW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1034","Name":"CLAZeGKuI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1035","Name":"zSvYgUDdL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1036","Name":"QhrtrfscR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1037","Name":"YzWNgshXi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1038","Name":"mQmyyEMKs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1039","Name":"UhMdGtnGl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1040","Name":"YlaBFiRRS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1041","Name":"HphSozsQr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1042","Name":"xfssDkVfP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1043","Name":"ZBiysAWQj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1044","Name":"WriPwjTcz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1045","Name":"SLROhFFlF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1046","Name":"sYtOSAaWg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1047","Name":"WADyfVrpw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1048","Name":"OosKkUtpo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1049","Name":"qeFkUdWah"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1050","Name":"dPKkiahoP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1051","Name":"hLgngNewy"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1052","Name":"PVxnHwtlN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1053","Name":"tjYEDnhPn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1054","Name":"RagGmijpt"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1055","Name":"KLgkcPRnO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1056","Name":"VeBufszVH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1057","Name":"YwgzjiVWH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1058","Name":"xZTKTULER"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1059","Name":"fvhzVCQoj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1060","Name":"thjeHFJdd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1061","Name":"pLCUCvFCj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1062","Name":"TYtXrwWEx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1063","Name":"jkhKhxOFp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1064","Name":"mwFBqxkUn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1065","Name":"eAvbVGhig"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1066","Name":"MsGnAOEAw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1067","Name":"ixkRZNoXm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1068","Name":"rnfnSURci"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1069","Name":"mIQbIUkfy"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1070","Name":"kmipVMYHD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1071","Name":"GYwPWwGiA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1072","Name":"kHctjktzu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1073","Name":"vQzDSFeNX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1074","Name":"PZRvHllcC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1075","Name":"gSFQOvgNW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1076","Name":"DXHHndoeB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1077","Name":"auuLTgSSb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1078","Name":"fZVjPdoqv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1079","Name":"BKqIhMatY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1080","Name":"iBiIaMCYm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1081","Name":"WgyfNbgCk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1082","Name":"uUeTieNPq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1083","Name":"onefjlpug"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1084","Name":"vkGyaOedF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1085","Name":"BHlUiVeet"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1086","Name":"oDcdaZsCR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1087","Name":"IKhQGxQjC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1088","Name":"zHaGTCeye"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1089","Name":"wSMFeIcmd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1090","Name":"MrehtMXlE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1091","Name":"KhxIQWKSQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1092","Name":"jNMdcArzp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1093","Name":"oBWvWkFcf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1094","Name":"LiOKhcqye"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1095","Name":"trxfMcVsF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1096","Name":"pZYlVzxQh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1097","Name":"NOEajLVee"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1098","Name":"iTjbtuwIK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1099","Name":"PKgmWgKPx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1100","Name":"eyFhaKXDR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1101","Name":"VZtsaMXTT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1102","Name":"kTxfWEcuN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1103","Name":"mkGsUaEJE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1104","Name":"TjCTlNnlB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1105","Name":"VOFKlZCdq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1106","Name":"gwMuSxlMv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1107","Name":"hLJCgNXgz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1108","Name":"qPPVotyFT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1109","Name":"UxuQYExZY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1110","Name":"SvNzfMefQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1111","Name":"mMivrGmgf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1112","Name":"ISzRmoBDz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1113","Name":"NThlXBxYX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1114","Name":"UToweBKOk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1115","Name":"cmOBaFbRn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1116","Name":"bpUVHGDlV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1117","Name":"JQaDekkeX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1118","Name":"bvonyBcjm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1119","Name":"MHcVnBHQe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1120","Name":"IfSBLjnyj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1121","Name":"sVxzSupCd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1122","Name":"YZrUeyeuj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1123","Name":"wwHrfmaMz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1124","Name":"geVvqDxwy"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1125","Name":"DMjqcqgpa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1126","Name":"vpQYQnbgg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1127","Name":"wlLXJzfMr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1128","Name":"okZjkTjdM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1129","Name":"lswJDzuGz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1130","Name":"NsZyqXcTQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1131","Name":"WpWCVAgWo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1132","Name":"npsKqAkxm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1133","Name":"DocvLqQAE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1134","Name":"ILysPGpqo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1135","Name":"AzBQgAHTV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1136","Name":"XqhojWLWZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1137","Name":"cSIJEtpGA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1138","Name":"aswpzMSns"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1139","Name":"RZaVanfDh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1140","Name":"jJgWtmsCK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1141","Name":"UHldyWCEA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1142","Name":"sGeqSwYEU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1143","Name":"bmSyuwEPY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1144","Name":"vBLodKNlo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1145","Name":"pTomyGknJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1146","Name":"uVVmaaARb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1147","Name":"jbqwXhZyc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1148","Name":"VCelNYzuW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1149","Name":"YZaxkEgAO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1150","Name":"mrXBLGjtU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1151","Name":"oXpmTGCmv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1152","Name":"JRksWtdeC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1153","Name":"XesGKPeXU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1154","Name":"xwkIBEXLU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1155","Name":"kzEzjvdZV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1156","Name":"mXuAUWyht"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1157","Name":"DtQXcQRQN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1158","Name":"umQWhZAGU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1159","Name":"vZvQuaZwa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1160","Name":"HyaljwDKD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1161","Name":"wxfzzykdI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1162","Name":"kwuVHauvC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1163","Name":"emdlffTIM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1164","Name":"qDACdHpYH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1165","Name":"dBTPxAfxL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1166","Name":"oDkRVAcKI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1167","Name":"MMdnvNmdT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1168","Name":"uekZTrkdm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1169","Name":"NpAMQiMla"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1170","Name":"wQBVGBEra"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1171","Name":"rkGbvxqMh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1172","Name":"TbBEXiIla"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1173","Name":"ITiiJMJVH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1174","Name":"CNcAGZjav"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1175","Name":"YfqxDonZr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1176","Name":"ixcKuFixQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1177","Name":"UUQEubTCl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1178","Name":"sdXyoLlAo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1179","Name":"cUWPsOsWY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1180","Name":"WONUHLSII"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1181","Name":"oBktSMFQa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1182","Name":"tSbOcQxTu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1183","Name":"spzMpRizk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1184","Name":"dzYuXtQGZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1185","Name":"uqWnTVtAI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1186","Name":"WSMGChrhK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1187","Name":"xnxnVokyZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1188","Name":"dwtOZQFpT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1189","Name":"ZszVsGdth"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1190","Name":"YFulYdkpX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1191","Name":"pDGZafurX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1192","Name":"OGqiSDPiW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1193","Name":"ApJkYhNZV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1194","Name":"sEtnAHLmj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1195","Name":"FjDDqXJcV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1196","Name":"jJBazBPOX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1197","Name":"EbqFmnRZI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1198","Name":"EuQICHsft"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1199","Name":"imOljIjxN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1200","Name":"JeZYcCuKn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1201","Name":"tEFXREYnY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1202","Name":"xCyiHJFmP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1203","Name":"wnuwyJktf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1204","Name":"ylbPywWSN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1205","Name":"HNQjEnrfG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1206","Name":"rEUCCjqFe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1207","Name":"kHGYaeFOU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1208","Name":"ULDUcqoBV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1209","Name":"yeTIrHZWq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1210","Name":"IlrBiqAQc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1211","Name":"eqwIRXhpo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1212","Name":"LgPftMEYZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1213","Name":"MsJQSopzB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1214","Name":"tIbViNgXP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1215","Name":"LsSrhuWOk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1216","Name":"MwbBbEkpb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1217","Name":"IavgETcWE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1218","Name":"QXjPXeztc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1219","Name":"XfMDFDbyj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1220","Name":"rrKdnWFSL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1221","Name":"jhRLcoJnf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1222","Name":"VgDMPhoDV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1223","Name":"lWecThfGH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1224","Name":"JoEwWHMcE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1225","Name":"lsieTBswW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1226","Name":"EgooeooWI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1227","Name":"BtwrRfFun"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1228","Name":"tHRfUMooJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1229","Name":"VEmKdkHzb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1230","Name":"IPPftVeSR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1231","Name":"RpnDROAiF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1232","Name":"DRojcuANe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1233","Name":"fCQYtUOoJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1234","Name":"umjzCxYkg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1235","Name":"ZzTSxugwW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1236","Name":"BDqrHBQSe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1237","Name":"SoXgOIgss"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1238","Name":"haFVacysi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1239","Name":"pjOkMMUSN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1240","Name":"xsvbNPruj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1241","Name":"BggTmpfUG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1242","Name":"KCmzalpYl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1243","Name":"DVAuKHhRO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1244","Name":"pAIkVFJVr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1245","Name":"CMezmpKYt"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1246","Name":"KxGhNEHmM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1247","Name":"HRexJPyeE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1248","Name":"hFqZpvWOi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1249","Name":"eOlAvfRjZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1250","Name":"QVcUGIWmT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1251","Name":"MvAOQiwnU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1252","Name":"GeADVqMub"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1253","Name":"duVxiXaSN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1254","Name":"DzZjWfIry"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1255","Name":"bftBOgqXg"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1256","Name":"zPKmWSECs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1257","Name":"LwLAyuSYM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1258","Name":"RAWiHGrcP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1259","Name":"CYbtrOucc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1260","Name":"FRUURLxaP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1261","Name":"RcJLEskUA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1262","Name":"lQiZihgpI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1263","Name":"EraYheTyh"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1264","Name":"hdAVZwrba"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1265","Name":"pxwDcTTlx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1266","Name":"UbLpynLNB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1267","Name":"quHkgijnG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1268","Name":"LhAPdWfNQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1269","Name":"qWzhPDrbp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1270","Name":"eoecnNTwF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1271","Name":"GPLkcqKLn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1272","Name":"KqVgAFYYD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1273","Name":"xrJsQqEgx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1274","Name":"XNaVRgVxb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1275","Name":"HqimsAQDN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1276","Name":"mvwxOBSJO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1277","Name":"rQddpfBag"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1278","Name":"EPnbMQkld"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1279","Name":"QLIHoxXRY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1280","Name":"YxdRwiuWU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1281","Name":"eeqyHBFLG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1282","Name":"ClQQMNvdp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1283","Name":"ANWPQiVvr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1284","Name":"uzTKPQGgB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1285","Name":"YfBSKJFpi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1286","Name":"FQypeurVd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1287","Name":"ZVXCAJcAt"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1288","Name":"mcOfTiZUO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1289","Name":"fnoHiqMTB"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1290","Name":"MLmlozWZQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1291","Name":"QzYNPVUVM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1292","Name":"XZwVIsNDi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1293","Name":"FburHKHXo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1294","Name":"NQyFWbWpL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1295","Name":"QhPfiZXRG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1296","Name":"bmULpPSZL"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1297","Name":"WpXREJxBA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1298","Name":"FnUMqKCiM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1299","Name":"GIsqfuaKm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1300","Name":"CkjTsGVfJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1301","Name":"WtqHBQnqV"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1302","Name":"GcNgDcDEH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1303","Name":"qsGQMFvMU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1304","Name":"MpnvajTKG"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1305","Name":"xpBDYldDQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1306","Name":"LGzObmlLn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1307","Name":"HHEaIghYv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1308","Name":"QuXchRhZI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1309","Name":"grbjspfjm"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1310","Name":"GHRjmMxzY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1311","Name":"kqUtnrcbf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1312","Name":"hQrPTtOQW"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1313","Name":"FneWMeuyH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1314","Name":"micuoSiIl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1315","Name":"BCAOyCyMa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1316","Name":"NQXZlrHiH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1317","Name":"fNMBWYRfr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1318","Name":"CYKQgZnse"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1319","Name":"tEzXGRxNM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1320","Name":"UvRLthGfO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1321","Name":"mLLDBvwPA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1322","Name":"nMQXXpXxE"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1323","Name":"wJbwsvxhR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1324","Name":"acAzQjjwQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1325","Name":"NAgOCrqss"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1326","Name":"mYgEAwNfS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1327","Name":"yTGofbSjl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1328","Name":"xvhlaDzmS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1329","Name":"WNAPqnwnQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1330","Name":"pbWKZUUPw"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1331","Name":"pWWcoxJoo"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1332","Name":"TBesPTOrY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1333","Name":"uchwFyFTX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1334","Name":"HHLDsfyDa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1335","Name":"bKRdlSaQI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1336","Name":"UkFNVrsna"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1337","Name":"ZDSZGrRDk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1338","Name":"LOdUXrQNs"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1339","Name":"xHfjuzACl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1340","Name":"eTbycMfus"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1341","Name":"mlFLNvNcd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1342","Name":"UdsRTPHlI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1343","Name":"ByJZQdMSx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1344","Name":"gmjmqOlBR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1345","Name":"EQnRHYjhS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1346","Name":"pCcuqUcDD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1347","Name":"yhGKcSZfz"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1348","Name":"BagxsUrYI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1349","Name":"TvfasuESb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1350","Name":"zzRVdMMUT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1351","Name":"JULytcrBO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1352","Name":"GHxpoUadl"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1353","Name":"DxvtdSGSu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1354","Name":"uTmoLrpmJ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1355","Name":"mXzSLLopR"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1356","Name":"AbkkRwGYb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1357","Name":"aDbCfjTrc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1358","Name":"HcsoQTmJv"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1359","Name":"QrbgKayVa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1360","Name":"zcahMmIrP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1361","Name":"HaoFdizkd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1362","Name":"cxdLYrGam"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1363","Name":"VRGwMPJPc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1364","Name":"GsoaxlvkH"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1365","Name":"dRArSdSxu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1366","Name":"kcssSVFxc"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1367","Name":"zqqCnqaFC"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1368","Name":"ZZmZxCcFN"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1369","Name":"DpbJHVJcY"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1370","Name":"njrkgcDse"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1371","Name":"ZyxFDNJBP"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1372","Name":"geDsWNWIM"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1373","Name":"CMFtIEKqe"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1374","Name":"GoAesalFZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1375","Name":"CixatjOsZ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1376","Name":"YZRUAlWfi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1377","Name":"kXpNkLrlO"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1378","Name":"YOWUcKHCQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1379","Name":"SaRdNMlwT"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1380","Name":"WjezeTPOS"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1381","Name":"rvJZcqOOK"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1382","Name":"KziZSoUSb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1383","Name":"GoxriWuhI"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1384","Name":"PMSArvwnj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1385","Name":"GYaUMHqPn"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1386","Name":"niBePoAOd"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1387","Name":"NHeicZRXf"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1388","Name":"ZYLmArrJa"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1389","Name":"mQcESbySQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1390","Name":"muAiTRDkA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1391","Name":"zYdHIhTFk"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1392","Name":"ezYfXBwNj"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1393","Name":"gMrezEPgA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1394","Name":"sFolZQlDb"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1395","Name":"akPPEFhAA"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1396","Name":"VOjTtoKDX"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1397","Name":"UiEWdLjcu"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1398","Name":"elCWKkgeQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1399","Name":"nutMuXqbp"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1400","Name":"UCjpDWaoq"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1401","Name":"jPszKqRGr"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1402","Name":"qWMpnmSDi"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1403","Name":"BkOeQTdBQ"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1404","Name":"eXgvujDrx"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1405","Name":"ChoqAlWXU"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1406","Name":"RxuuDRBGF"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1407","Name":"CiEHZhDDD"},"emitted_at":1673989569000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1408","Name":"YRSWnwuuC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1409","Name":"UMPGfsblt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1410","Name":"bESHxNtyJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1411","Name":"uRoYzJZWj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1412","Name":"haFrZaawh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1413","Name":"BYRUAbkvs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1414","Name":"lBohVUuwU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1415","Name":"AbSwpRlcF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1416","Name":"mRjtRznLW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1417","Name":"usvNKiEgu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1418","Name":"NoXymywqn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1419","Name":"EFQLrKosM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1420","Name":"TPDOeCOkZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1421","Name":"kPurDLnLe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1422","Name":"FlDnZJFSe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1423","Name":"OiHVAkKiH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1424","Name":"nRtYcQiLD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1425","Name":"grgYXECRs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1426","Name":"nVQeESoAw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1427","Name":"fiSztxVLo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1428","Name":"mGsOhMWyH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1429","Name":"NkeBZlQbc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1430","Name":"vAmFhPfyO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1431","Name":"kelhsDiat"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1432","Name":"NfrmbEVoP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1433","Name":"lPGhMGqnj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1434","Name":"LmJkdYGbU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1435","Name":"cZZdRhleV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1436","Name":"rXIPnTvTz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1437","Name":"eQPOTBgUE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1438","Name":"YFcvpbszb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1439","Name":"IKMZnAZHt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1440","Name":"QciNlZWyV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1441","Name":"JqPlkebNc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1442","Name":"qDiVAomHo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1443","Name":"WNGrPGPkK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1444","Name":"DCArfmUNl"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1445","Name":"ttMbInVMx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1446","Name":"gZjZQWeMq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1447","Name":"etrWzbjCL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1448","Name":"OgyElGZwL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1449","Name":"grDFRsAoK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1450","Name":"lUzLhURbT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1451","Name":"ptxWrqNBz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1452","Name":"JhiVuyZiT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1453","Name":"gVqUFppKR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1454","Name":"qFrYxEBOF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1455","Name":"ZmtNzGGWl"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1456","Name":"pPEUYBjFF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1457","Name":"vAkzBgMoj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1458","Name":"BCwvuZocc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1459","Name":"XqgtAuPzy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1460","Name":"BraGEfvpA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1461","Name":"TZJyINaqv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1462","Name":"xeGYgcCeX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1463","Name":"rbnoxVYeu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1464","Name":"cglWGYhCY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1465","Name":"RXuVoPusw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1466","Name":"QlkrlSGZq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1467","Name":"nOhJOzKUb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1468","Name":"jegzLKtmt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1469","Name":"VVEqtobEg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1470","Name":"CBMTqGIEv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1471","Name":"PbnjJgUdo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1472","Name":"lhQUrnSBD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1473","Name":"EvOAwTjMb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1474","Name":"bWUzLxSnK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1475","Name":"QtRynEduW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1476","Name":"tjZwZcuBK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1477","Name":"gChmJzgUR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1478","Name":"dZuhVKCdn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1479","Name":"ZIbXOPkRt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1480","Name":"xLtAovVMS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1481","Name":"RYZIcTeMI"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1482","Name":"ZdIlGZbLU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1483","Name":"NoQIuwuBF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1484","Name":"GUzaXoFDX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1485","Name":"WkBLpjtnm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1486","Name":"GOfyeTzuF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1487","Name":"yKfOzJfSJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1488","Name":"nffcvzUUk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1489","Name":"MaoAMQJQO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1490","Name":"lpXyhOJwc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1491","Name":"dSneeJcLb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1492","Name":"QqorwNgUg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1493","Name":"KCQiqXpZq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1494","Name":"AmMkxJFVz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1495","Name":"LcCYXSNBT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1496","Name":"OLyhouwoB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1497","Name":"sfToRQtAA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1498","Name":"BSHQIXxZQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1499","Name":"trPCeyUWs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1500","Name":"WhemAUDkN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1501","Name":"uyQrauQKm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1502","Name":"pkWccmKQc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1503","Name":"AhhadNuGO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1504","Name":"cVdWKIiLS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1505","Name":"ZGbDkEpwJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1506","Name":"lAEatsInM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1507","Name":"nZLlSpcQt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1508","Name":"HCECtypOn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1509","Name":"KmRDtAGJC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1510","Name":"uoIbARUqt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1511","Name":"ezgJnHQJi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1512","Name":"HbrYktpIq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1513","Name":"GpbvJheif"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1514","Name":"HlanhGFTL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1515","Name":"ffMeVviuQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1516","Name":"oXOHfjBiv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1517","Name":"lUimsJUcO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1518","Name":"zGnJvwmuZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1519","Name":"SqifSFueB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1520","Name":"mxKFyTUWe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1521","Name":"GFbKGZNlf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1522","Name":"YYzfTGcWr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1523","Name":"AJhHRrkPk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1524","Name":"xykNSJQOX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1525","Name":"qzKoQhBum"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1526","Name":"RuKDwlkiS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1527","Name":"UPgwzcYAp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1528","Name":"eaccHNDPK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1529","Name":"gUwcqoeal"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1530","Name":"fvmyFemxS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1531","Name":"CaAnuZbEK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1532","Name":"dlTUbaYOf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1533","Name":"dfgMhdbMp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1534","Name":"oDdDkAixf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1535","Name":"tTOeXirOQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1536","Name":"anZsAKIhr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1537","Name":"DwYwPizjZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1538","Name":"AeQQCWCNz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1539","Name":"oKJiWSphf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1540","Name":"EpwTRUHON"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1541","Name":"cIcscaGPO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1542","Name":"WfCpYkoxk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1543","Name":"TSNAgTxcm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1544","Name":"KJhlRWVrx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1545","Name":"DvPMxhxBL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1546","Name":"etryAwvVr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1547","Name":"HnujJakzf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1548","Name":"KGBWjsCtf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1549","Name":"GgDvlPtiz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1550","Name":"TyWDsGnCY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1551","Name":"BoOyrNuKa"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1552","Name":"XoFFIcIYA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1553","Name":"RwzIWSuVh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1554","Name":"VobCDildL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1555","Name":"phlEAszNT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1556","Name":"hUAbkzLFV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1557","Name":"SOisZsHtq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1558","Name":"btKMarFQZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1559","Name":"lTwWtAZMt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1560","Name":"WYuhtcvcS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1561","Name":"WrrYWfKDC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1562","Name":"HNMhLVrYA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1563","Name":"MnffaxwOT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1564","Name":"sAoPANban"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1565","Name":"UeKIRyxJM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1566","Name":"bDiquWMfm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1567","Name":"YeaxWpGeJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1568","Name":"ndLXqMbGS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1569","Name":"iVeCmogAu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1570","Name":"lOTXToxUW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1571","Name":"CckkxVXwx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1572","Name":"FisxvwFqV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1573","Name":"hHmuBQhzL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1574","Name":"VhGmRoCos"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1575","Name":"WmUkamrpM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1576","Name":"cwioJmqwE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1577","Name":"iIHDNULrr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1578","Name":"LKQnDjUjX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1579","Name":"FRMyOAoyI"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1580","Name":"DGOxKUBLG"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1581","Name":"lZOBAnlpv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1582","Name":"MaIboFxHu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1583","Name":"BsdtZLaLS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1584","Name":"tmeRlzJwR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1585","Name":"nYzDiiYDN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1586","Name":"DNDVNJXIx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1587","Name":"UBWdLOMXy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1588","Name":"GVjvGmhei"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1589","Name":"pmaZaFHQC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1590","Name":"RuplVPlwt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1591","Name":"NYlsgnTEx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1592","Name":"IvCJDkIti"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1593","Name":"waNubHkxJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1594","Name":"sMfeTgrJH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1595","Name":"HUHJirbFD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1596","Name":"DoFmcTobK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1597","Name":"OCzbLpxHw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1598","Name":"OVUSQtUeL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1599","Name":"gluLDWhyx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1600","Name":"aezNiwCjL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1601","Name":"htsElUgol"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1602","Name":"aXVUgEdkJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1603","Name":"QijlDlLvC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1604","Name":"WibRMVUlu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1605","Name":"OKidTaZga"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1606","Name":"SrDhBcZwb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1607","Name":"krmZsHuMg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1608","Name":"vzvrLGTZH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1609","Name":"hQTyIKtHW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1610","Name":"CoeftnBoH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1611","Name":"LsxByUjcr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1612","Name":"qrKGSdBEV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1613","Name":"VnSjUihoX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1614","Name":"nMyuMQLQo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1615","Name":"UaONcZETp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1616","Name":"VgGNGIEvM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1617","Name":"MLyOVQhmi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1618","Name":"pEpAmaagz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1619","Name":"vrHGUULfW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1620","Name":"rXgQkQDRE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1621","Name":"yPVWSvVss"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1622","Name":"LswiPQDbo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1623","Name":"lCsZNduNZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1624","Name":"MRocFayZn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1625","Name":"YmeWdRJEp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1626","Name":"fkHTewQOd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1627","Name":"dGPeAVjbP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1628","Name":"aiupwecpc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1629","Name":"scOjWyzyD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1630","Name":"xDRQuovMF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1631","Name":"vbiORpJts"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1632","Name":"MwqsihmvT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1633","Name":"RyFwwbXpZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1634","Name":"zGcGsbwEe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1635","Name":"ovsLqslBh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1636","Name":"SGGhLkFGb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1637","Name":"znebUZCSd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1638","Name":"aRnkZWqLO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1639","Name":"zhHpQJith"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1640","Name":"TXkhRvzqr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1641","Name":"XgqUjompU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1642","Name":"qfAaqXgyA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1643","Name":"xpIqHzeft"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1644","Name":"RokHqSuMZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1645","Name":"QApCXjFoq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1646","Name":"YOejCOFAY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1647","Name":"EbQcNDojV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1648","Name":"BFeRPWOWQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1649","Name":"BVXCMaMCn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1650","Name":"zdkNGusVe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1651","Name":"LRWGgpgbV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1652","Name":"aTPeBuumD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1653","Name":"rctLgBJbu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1654","Name":"CSIuTVbbp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1655","Name":"RVtZJyrVs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1656","Name":"rPngIxzqQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1657","Name":"ZgTFUopMb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1658","Name":"EkfqrYYlj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1659","Name":"oPlxYreYl"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1660","Name":"mhAkfWCDs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1661","Name":"WpuFZRsYE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1662","Name":"vdaoRlcWq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1663","Name":"ciCQwmnoH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1664","Name":"pPhSJqWRY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1665","Name":"vuSxamzZX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1666","Name":"usdsBgDHo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1667","Name":"YbIxIORFA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1668","Name":"NeVXHDKVt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1669","Name":"xPnNZMjRY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1670","Name":"DRcVmEXzf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1671","Name":"pDxMLTIVh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1672","Name":"ElPyhsjXp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1673","Name":"dZFjpRUBA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1674","Name":"lSjwJvuFN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1675","Name":"ZRziFdVnx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1676","Name":"azgPPNZhB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1677","Name":"GkvWEhIys"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1678","Name":"SQBFuDBsp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1679","Name":"SLcvuIYcB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1680","Name":"SqnZLveAk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1681","Name":"jeTfcvMoz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1682","Name":"OYLdBupTt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1683","Name":"GnEgDHpMv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1684","Name":"UsqtxLbWb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1685","Name":"zwASyasPy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1686","Name":"jxnIbvvGe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1687","Name":"lvjIHyvnN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1688","Name":"VqJjuiHUP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1689","Name":"yqkWozhho"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1690","Name":"xETOdfkpF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1691","Name":"yvXKGNHZE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1692","Name":"KVPoVLCme"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1693","Name":"SlkZIGIXy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1694","Name":"fXEFVmJTU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1695","Name":"jroeMrDYb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1696","Name":"cAxJyTArE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1697","Name":"MWPbvvTCp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1698","Name":"nDydKllDy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1699","Name":"HnKdRclys"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1700","Name":"RBxDPiogw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1701","Name":"RtrqctKLx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1702","Name":"RaPvevDFb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1703","Name":"IjwxPnoAa"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1704","Name":"QOgrbDNWh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1705","Name":"uhFqkpddr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1706","Name":"xUIcvZfxV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1707","Name":"GvTWcAQgZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1708","Name":"xVsvhJMUA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1709","Name":"evNwWMrEZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1710","Name":"DyOrDFNAl"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1711","Name":"IZLrbNFbB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1712","Name":"sffxdsusp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1713","Name":"vKApEoDAs"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1714","Name":"eTvMLNDgg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1715","Name":"XUVPsJSDw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1716","Name":"OujIjHYFI"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1717","Name":"yTDwBwxTT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1718","Name":"GhrHcljGu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1719","Name":"nCfBbhGqf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1720","Name":"bQTpepIoy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1721","Name":"NCefhXhGI"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1722","Name":"aJeJzXoUo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1723","Name":"euPFFEVre"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1724","Name":"PMjRjrxrU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1725","Name":"wJBVVpmUO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1726","Name":"HgzWxJaCY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1727","Name":"uXUxIbOGB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1728","Name":"YqxFqbvAN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1729","Name":"rIHMqRTBk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1730","Name":"wBlOGlqAz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1731","Name":"laZoKyCJK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1732","Name":"kZIZIPEtk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1733","Name":"oWjtrniXH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1734","Name":"rvdYOqNnS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1735","Name":"KlGCLaHVE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1736","Name":"KnOEqPWpm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1737","Name":"JOQARUXsB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1738","Name":"VgcNKllHX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1739","Name":"dwaLVwwQD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1740","Name":"fMyLFuTFT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1741","Name":"pUWHKBCie"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1742","Name":"XktCDkNdw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1743","Name":"BBsLZQHQt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1744","Name":"zyTiTHRwN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1745","Name":"yTRMHczRi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1746","Name":"PjbVLrAan"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1747","Name":"opJOwARtc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1748","Name":"MdRbTtcWY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1749","Name":"JwknjXYis"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1750","Name":"JlAngobXQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1751","Name":"BGIbuSMVx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1752","Name":"OubNoTPxG"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1753","Name":"ApqFgoWnX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1754","Name":"pTmmbfawk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1755","Name":"nINZzYXkp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1756","Name":"itvawLCni"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1757","Name":"OawxKdzhV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1758","Name":"xqeAEIECf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1759","Name":"boEfbpeXS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1760","Name":"tRJYIRwEo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1761","Name":"kgAExQWAG"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1762","Name":"ukrZVfNEx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1763","Name":"eXzYihCbK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1764","Name":"zLdRCXPFT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1765","Name":"jPTuWoRpf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1766","Name":"zOJpemMSM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1767","Name":"RqpSYIdzx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1768","Name":"QjlGVYauN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1769","Name":"YgMQjplJR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1770","Name":"qqiBdeaAS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1771","Name":"wtgyNsWlq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1772","Name":"tStORqzMi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1773","Name":"GofIFNBGR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1774","Name":"RHHhjmHbC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1775","Name":"YWGimTuCx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1776","Name":"rYiKkCrLq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1777","Name":"EywBiCfuB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1778","Name":"wVkRYZOwF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1779","Name":"VQaFbDnfL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1780","Name":"KAtbSXBwZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1781","Name":"NUVbeAMDx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1782","Name":"IJCfiWavT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1783","Name":"LuCDjpfVS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1784","Name":"frMUvLVHM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1785","Name":"bzXWoTNzO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1786","Name":"muTAHKSPw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1787","Name":"GotqLDJrz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1788","Name":"hWgLwiBPm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1789","Name":"NnjSxCLYd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1790","Name":"ytOEtWCCn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1791","Name":"fzmFAoXQr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1792","Name":"BTHmoXlpH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1793","Name":"MuoXFrron"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1794","Name":"MgXDhQCgu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1795","Name":"DkWRdjmpk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1796","Name":"fQSJjcbiY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1797","Name":"iVWRzRbbe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1798","Name":"JDzWYUsyq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1799","Name":"PgndGhUby"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1800","Name":"qTYxXWYSp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1801","Name":"RhMuipqku"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1802","Name":"rfLQgaOcT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1803","Name":"cVbFMROeo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1804","Name":"oMVqiajeH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1805","Name":"FJPVOufvh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1806","Name":"bFKPlowdk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1807","Name":"sROwmKYoT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1808","Name":"KCJDIIsjo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1809","Name":"QIULxIeFH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1810","Name":"LferBVQOx"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1811","Name":"OSjcYWZzi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1812","Name":"fNFKKDkwv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1813","Name":"aZwxZWuCV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1814","Name":"rezpNPnig"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1815","Name":"ViwMoLaUn"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1816","Name":"qWiywSHoa"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1817","Name":"KedFHdsQN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1818","Name":"PJnJRJciu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1819","Name":"SEGsXEsfF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1820","Name":"ERXAVRLWZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1821","Name":"rniHxwKpg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1822","Name":"KKhPUNIGa"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1823","Name":"JyJhzwcxP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1824","Name":"KuZosAbPu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1825","Name":"hlfwSooVU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1826","Name":"TQIjCErFu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1827","Name":"nyjCGSyQW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1828","Name":"ntZYVydbZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1829","Name":"UVUJqfacb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1830","Name":"YLUJMqUkV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1831","Name":"WWpstbWlB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1832","Name":"FylvuXiTH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1833","Name":"vKByGttMi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1834","Name":"noTvEkuKD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1835","Name":"weuhSDkfT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1836","Name":"EQGhgaOFw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1837","Name":"tRoeEMmjd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1838","Name":"cSNnEOGam"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1839","Name":"qdZLsWfnz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1840","Name":"qcQLJswhL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1841","Name":"XmkGhrLNr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1842","Name":"slZKDeInM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1843","Name":"owjFgQajO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1844","Name":"FJnTvDERj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1845","Name":"NXgsHfmMD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1846","Name":"QyqvXmBET"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1847","Name":"FaWXnZLHT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1848","Name":"QVNkatdUg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1849","Name":"tlQvaKuul"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1850","Name":"FUUZslNut"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1851","Name":"usRQwBslF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1852","Name":"sfnWHZkPy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1853","Name":"ZQjPhGunb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1854","Name":"YIfdvpGim"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1855","Name":"qqgfwijzX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1856","Name":"YvGoliocF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1857","Name":"OohRGvjWN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1858","Name":"mJvFeSIFo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1859","Name":"zhMtJJKid"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1860","Name":"gdAsnQXqc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1861","Name":"EqejFDwcu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1862","Name":"iDeAlhbCF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1863","Name":"jrDzTcnVC"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1864","Name":"xHTIMCtMM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1865","Name":"kGXhdyGrr"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1866","Name":"GowRBBatb"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1867","Name":"FXIUXeBIK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1868","Name":"ysKDIkUOl"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1869","Name":"YMBXDiNRi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1870","Name":"NChMyEvIp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1871","Name":"gNmPqNGym"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1872","Name":"wWOQgeVgH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1873","Name":"VFgVGsIHp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1874","Name":"YCbDhhzTK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1875","Name":"luVLnqArd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1876","Name":"GOfdAMdjK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1877","Name":"mLUuhdCJL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1878","Name":"yMBsqiWhO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1879","Name":"ARYAuqiXG"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1880","Name":"JQPxfqOvP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1881","Name":"ksgZuUnJi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1882","Name":"FIPGRgpZN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1883","Name":"xxdAwLLRR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1884","Name":"eSlYiBubf"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1885","Name":"dsyTgquTg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1886","Name":"WyCCCCZOi"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1887","Name":"sZfkSUGko"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1888","Name":"KoshTpMiD"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1889","Name":"EhDuYIfXa"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1890","Name":"oSrHKHaGJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1891","Name":"fzYRneYpz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1892","Name":"BWXJlVIHW"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1893","Name":"NHaUTNHJd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1894","Name":"EPfsnBiru"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1895","Name":"USzzdTLMo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1896","Name":"jGtEfTCEz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1897","Name":"CVyUIYovK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1898","Name":"rXAovyinw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1899","Name":"bJyDfSfTy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1900","Name":"hSQLmrDGq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1901","Name":"PTCURjUPS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1902","Name":"XGyrxpmNY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1903","Name":"EeoZxAlSA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1904","Name":"yRLMrQcQe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1905","Name":"gyChRxXLd"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1906","Name":"VELqQOqLw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1907","Name":"hXNTxAdrX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1908","Name":"cmetNLzSu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1909","Name":"AdZGxKGte"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1910","Name":"mDtNfXzrA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1911","Name":"YDIRZPbja"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1912","Name":"rsEoIedKX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1913","Name":"fvnAScCDE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1914","Name":"mfCFwNgVe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1915","Name":"pvZXiDsNy"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1916","Name":"LGXXpPPIN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1917","Name":"LXwGAnRmj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1918","Name":"QbzTuJaic"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1919","Name":"UDoIdTbFV"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1920","Name":"okbwlcirZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1921","Name":"xdvuZjfrc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1922","Name":"NiPeqbaZo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1923","Name":"yoiQrdkin"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1924","Name":"EQIqKfLwv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1925","Name":"KCrxupgFN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1926","Name":"CnAgcBvCS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1927","Name":"NfErjinJM"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1928","Name":"MYjGuJVtp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1929","Name":"VsySGYvuZ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1930","Name":"RFEXsXXjN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1931","Name":"yNaVywKpu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1932","Name":"YzFCakYWQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1933","Name":"zIrdXfDdu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1934","Name":"CmnvGGaRz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1935","Name":"wLXdmNaUB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1936","Name":"JTYvvUFWo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1937","Name":"XCZEptOqU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1938","Name":"SwJVlfcyh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1939","Name":"nWqPxfKsJ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1940","Name":"qhwuLySEX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1941","Name":"QkBLHraxe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1942","Name":"jmwTwSRDR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1943","Name":"rNKDmJZTv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1944","Name":"ISBmlRfOU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1945","Name":"iXhOWBVEA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1946","Name":"afYJwrEaP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1947","Name":"QipBDdDxt"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1948","Name":"kNKSuYABX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1949","Name":"phJJnoQBh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1950","Name":"atJlfXHBR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1951","Name":"InTRngtDE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1952","Name":"lBjIjfVnc"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1953","Name":"hExPNbIqw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1954","Name":"PwDzfwFpq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1955","Name":"NUoMQrisY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1956","Name":"njtBQMSWL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1957","Name":"uyidcHvlU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1958","Name":"gXDaGdpqO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1959","Name":"JTwAdjOPh"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1960","Name":"tgZJWgCMm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1961","Name":"uhlqDRQtu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1962","Name":"LlLZImgEu"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1963","Name":"uCVSIGtBe"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1964","Name":"hvwFxmaNo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1965","Name":"ORKGOKrUk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1966","Name":"KDJZQriFQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1967","Name":"mKehEEnoq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1968","Name":"PaejmAeDp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1969","Name":"zBsmQHAeg"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1970","Name":"UHnUpDNKk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1971","Name":"trvAfDKeq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1972","Name":"gaveXBURT"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1973","Name":"dxMcRWBrQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1974","Name":"FfMxrsqxq"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1975","Name":"WOmKLuKyH"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1976","Name":"kgVqctZTU"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1977","Name":"uLKubUYwK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1978","Name":"GpnkXvauN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1979","Name":"jedHpevqz"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1980","Name":"IRxPyCaGv"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1981","Name":"IwrIIYLRF"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1982","Name":"MeOEiDmWo"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1983","Name":"VdEslNNyw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1984","Name":"sMIlPjhxE"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1985","Name":"HdHvGPDGP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1986","Name":"zxXiBBFJR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1987","Name":"xZVKSVuni"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1988","Name":"fgRwyXiBp"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1989","Name":"oPanlIwMX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1990","Name":"JoOvekwJQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1991","Name":"iTbiBdhqk"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1992","Name":"oFsDFmhwj"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1993","Name":"ACKZuTaMP"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1994","Name":"WajqZuNtO"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1995","Name":"VakJkFTVw"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1996","Name":"rLXyynWrQ"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1997","Name":"wtikYRNUm"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1998","Name":"XlDhHgvrN"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"1999","Name":"MuWaPftbB"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2000","Name":"GbAmLYPih"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2001","Name":"DXWxBcwTG"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2002","Name":"MjGjRSjoS"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2003","Name":"KbVeNNyOX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2004","Name":"aCqHeaQih"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2005","Name":"cuZohieTX"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2006","Name":"QVAeygkSY"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2007","Name":"RuSMilGvL"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2008","Name":"MrsRqyxLR"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2009","Name":"pwQwQUhLK"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2010","Name":"mUIBBLUqA"},"emitted_at":1673989570000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2011","Name":"xKjQEvCmM"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2012","Name":"xceRMDiDQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2013","Name":"kaxrGRFfi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2014","Name":"HEYIuimlf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2015","Name":"nCwNqySWW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2016","Name":"vMPSWrSJL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2017","Name":"DBvZkMnii"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2018","Name":"jQwZbKStp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2019","Name":"HIKFnPXki"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2020","Name":"SjYQAhhiS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2021","Name":"QyIYjoVUX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2022","Name":"jEHPlGEFe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2023","Name":"nmJpSRvnD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2024","Name":"LdRnALZhY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2025","Name":"HECBlZZrQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2026","Name":"pjcdBdwoC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2027","Name":"coEfSabDA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2028","Name":"OPnJdYDro"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2029","Name":"GpUKmDPky"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2030","Name":"UKeSIXMpl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2031","Name":"QjagvIoIR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2032","Name":"jSlbrjbPZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2033","Name":"eImjNynkF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2034","Name":"QnXYmLYPo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2035","Name":"PShIEGaYp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2036","Name":"DjKYExPEU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2037","Name":"AaFiAFDXb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2038","Name":"fninnPlJR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2039","Name":"SXRQVXZNq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2040","Name":"vwgOJuYWW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2041","Name":"gNMZElGdF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2042","Name":"ZebWNeahQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2043","Name":"QrjVftJov"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2044","Name":"sExvwIWvS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2045","Name":"dQUmkWiXS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2046","Name":"CfGtIdJVE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2047","Name":"gnJhSONNP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2048","Name":"HRBUuvGtc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2049","Name":"CdkVLUpHX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2050","Name":"xrpTjSXwI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2051","Name":"VDioxFwee"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2052","Name":"CkaFqtbkd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2053","Name":"KGclAeobO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2054","Name":"FvmGeyuPr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2055","Name":"rPuuFeUjN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2056","Name":"KegzDupwb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2057","Name":"VcvONQjeC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2058","Name":"puuZGXmQJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2059","Name":"NSWXdLGhU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2060","Name":"ykFFANQut"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2061","Name":"PKDRrqjHL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2062","Name":"oLyyGbkEj"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2063","Name":"QJBtFYmqQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2064","Name":"vyterBikL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2065","Name":"UAUbSSzWe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2066","Name":"xnEjbXmXr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2067","Name":"wOqJamMdt"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2068","Name":"zsbxLloCA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2069","Name":"VnmBeSogz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2070","Name":"avCaAANNH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2071","Name":"rzFuRBdUD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2072","Name":"yzHKaIwzm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2073","Name":"SfUugeKjD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2074","Name":"iZbWAqBFu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2075","Name":"djLHUdWqd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2076","Name":"LAinltCBu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2077","Name":"MpmSPZDIy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2078","Name":"uevDboXDn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2079","Name":"IeiPZgwqu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2080","Name":"bbbqaULZK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2081","Name":"hLjqtQkim"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2082","Name":"sVqCqsMmh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2083","Name":"sAGINlrYd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2084","Name":"kpijcHlrK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2085","Name":"VnILXeamC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2086","Name":"oZTMNnYde"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2087","Name":"gFpYyGuIY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2088","Name":"dhlXLgjfB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2089","Name":"fotSiQtFG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2090","Name":"eHVnuHFFe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2091","Name":"nKGqQqqUk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2092","Name":"nhunUHxWp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2093","Name":"exlTVbTOY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2094","Name":"HfABVgxDa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2095","Name":"YNnffmSuv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2096","Name":"PpyYRjsBf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2097","Name":"kACwGWOaL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2098","Name":"wffPFlRUD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2099","Name":"BBSyIDvaf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2100","Name":"OWOWtTzmP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2101","Name":"uPpZkJOqV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2102","Name":"VPEcbhcoZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2103","Name":"iXIqHjlEe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2104","Name":"QiLlwbNbv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2105","Name":"bGRrLvkId"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2106","Name":"rWqPYBkQw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2107","Name":"vBuslxJHU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2108","Name":"FkDmdbdFG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2109","Name":"nVGJOdswA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2110","Name":"GaZdRSvID"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2111","Name":"cLQrgzdxB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2112","Name":"wBtyUqkTZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2113","Name":"LVoKqgSxm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2114","Name":"azrFhvgrN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2115","Name":"PJEVtWuRO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2116","Name":"ZLipiXDZO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2117","Name":"zrYbRmGCG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2118","Name":"XGJLToYsO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2119","Name":"zlyTqfLEa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2120","Name":"jtZpZguFa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2121","Name":"alPqZabvv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2122","Name":"MhDZVfoqs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2123","Name":"vWxibuBqQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2124","Name":"dLYRvhgDV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2125","Name":"LqOHwqsJx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2126","Name":"ZmsKTaVmY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2127","Name":"ooWuCPujl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2128","Name":"vhVFCgiQz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2129","Name":"aylOkTRYo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2130","Name":"NidOPzpHY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2131","Name":"yOPWgaBwa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2132","Name":"SgbDDGiaf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2133","Name":"IGTfGGqxc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2134","Name":"InTYsRKkX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2135","Name":"BKXaSDIiN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2136","Name":"HaHmdQDnp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2137","Name":"GYeawVSyv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2138","Name":"EXdoQjYEu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2139","Name":"xqGDaYeHF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2140","Name":"TiYOMjDxl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2141","Name":"LtNxijSWD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2142","Name":"gqEYvNyDv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2143","Name":"VwUtnFXQX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2144","Name":"IBGeWhhLi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2145","Name":"plChxguWk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2146","Name":"prYlvWcSZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2147","Name":"OmgdJddfP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2148","Name":"nkDzIawkh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2149","Name":"zZlluGXBq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2150","Name":"SYsQrxVxu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2151","Name":"RITPUMyII"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2152","Name":"cfxxjWVXZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2153","Name":"PgNNBzLze"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2154","Name":"pjKBoWDao"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2155","Name":"GUYAXdnrU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2156","Name":"UzJXQIgyP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2157","Name":"TELoYbFZr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2158","Name":"wSzgSRWfW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2159","Name":"ujgBVNhbY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2160","Name":"jXomPxgSs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2161","Name":"uhoDZSqhv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2162","Name":"kHaWcsJCF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2163","Name":"dmMhyeiMn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2164","Name":"LRNMgGGpz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2165","Name":"qgBXEmIBf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2166","Name":"mcPnPqwek"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2167","Name":"xnJdgTTKh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2168","Name":"IWSXePNWC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2169","Name":"DSglaojId"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2170","Name":"BHjHWphSA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2171","Name":"csgjKmrVU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2172","Name":"VzoLzzNRu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2173","Name":"gmHmFZABh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2174","Name":"XphDJmQPu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2175","Name":"QHzHtBVul"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2176","Name":"fhEJfJiVT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2177","Name":"cxxRqEfUK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2178","Name":"vCiJCXoUV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2179","Name":"ZZpGNFpTV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2180","Name":"PxnxHNvzk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2181","Name":"qDxwpfDUw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2182","Name":"ZELQunhAG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2183","Name":"dKNxSPCKJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2184","Name":"WiLGAlHbk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2185","Name":"BEWamjAZU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2186","Name":"zFkrRsVdE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2187","Name":"osxADJGvL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2188","Name":"gJAhLvwRC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2189","Name":"dolRNZWbN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2190","Name":"OCAStYVFz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2191","Name":"CIgqrJvys"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2192","Name":"YUQpmmBdA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2193","Name":"AqmbypLOH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2194","Name":"YXnRCadBg"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2195","Name":"WnIADEVqx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2196","Name":"eDRWtVxyR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2197","Name":"qPQRfFFQk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2198","Name":"ulNeFMiZk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2199","Name":"CvqbHcdFW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2200","Name":"IbBMuKkfp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2201","Name":"WNIfPQTBc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2202","Name":"yZXYUYzcy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2203","Name":"iVLcHgewm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2204","Name":"kMILhBJcK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2205","Name":"NDEFQsRTJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2206","Name":"yADOOryDU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2207","Name":"aeTfWqHHa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2208","Name":"AsOpwYIUy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2209","Name":"DRuSeLQeI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2210","Name":"gRxKqcuSw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2211","Name":"cVaQGucyi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2212","Name":"UTfwCMUOy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2213","Name":"IuNgtWmog"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2214","Name":"IkTXtfCTX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2215","Name":"uwZmERugz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2216","Name":"coScNNydg"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2217","Name":"TrxNfXrSD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2218","Name":"qdhApbDEB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2219","Name":"BGPhXXfIE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2220","Name":"bLokJOSJN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2221","Name":"GiSVwCubF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2222","Name":"ncklNAyae"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2223","Name":"vMudGIqTx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2224","Name":"kCJnBcwyL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2225","Name":"TbJoiWoml"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2226","Name":"sfuJufOff"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2227","Name":"RESuygOHd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2228","Name":"AsLFLqHkX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2229","Name":"QUaTscKZK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2230","Name":"PVmRhmIuP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2231","Name":"AtuqfSzlm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2232","Name":"ICQyowvGr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2233","Name":"byFhIEmhQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2234","Name":"HSiGNLWZH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2235","Name":"ptmIzXUiq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2236","Name":"ZODjtQoFY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2237","Name":"gECLVBPar"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2238","Name":"bhJXMgcam"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2239","Name":"TvuHgiIMG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2240","Name":"WpoCoeUHE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2241","Name":"qEBhswmYH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2242","Name":"oAYRUIFwm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2243","Name":"XAveLkEje"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2244","Name":"cjkFIVLoN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2245","Name":"WOojhwnKn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2246","Name":"IirMlKKBU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2247","Name":"PyASgubHn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2248","Name":"IBQySnZbJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2249","Name":"HLqGbkwvp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2250","Name":"kEvYqCOlB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2251","Name":"RlpsjEbei"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2252","Name":"YCLfpLnQL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2253","Name":"vabNaokla"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2254","Name":"bJJLNBCOL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2255","Name":"WauTzBjcF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2256","Name":"eYdeTjsws"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2257","Name":"vgKYyyqda"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2258","Name":"sIdMKgYKB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2259","Name":"evQPuwbWs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2260","Name":"bFdhPSkXs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2261","Name":"GAjKfOoNI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2262","Name":"hVAPzgmFu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2263","Name":"vUYBAbred"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2264","Name":"dKrzAeDAh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2265","Name":"GTUXQaajk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2266","Name":"MRlcItGPD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2267","Name":"UuzQFEDmW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2268","Name":"VlDGiEdng"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2269","Name":"ONcBMSJGT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2270","Name":"zsBQfjlMQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2271","Name":"ruRIRbHDq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2272","Name":"blIYukkyk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2273","Name":"bHkrDVwln"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2274","Name":"CpJseBkVi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2275","Name":"YLpTRvvpj"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2276","Name":"BeTyThSSs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2277","Name":"Anaxgeqqn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2278","Name":"vQnXJaavc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2279","Name":"tAkWaYrZk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2280","Name":"MGNcePfuT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2281","Name":"GzovobJeA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2282","Name":"IpuDMLpHr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2283","Name":"kxgIMWUfX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2284","Name":"cEitVFFhg"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2285","Name":"wJYDNHcxJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2286","Name":"AMCUmeBvZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2287","Name":"SkahEUbVP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2288","Name":"fXoElIUJZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2289","Name":"halWGmlgT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2290","Name":"QCyHloQGz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2291","Name":"aCGXYsHNi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2292","Name":"sYYIhDRlK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2293","Name":"bNvBGZPbl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2294","Name":"rsJOHUpDF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2295","Name":"jVyccykYj"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2296","Name":"sDzXaPPnh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2297","Name":"yyyPLbQsn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2298","Name":"gFsMTzgmk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2299","Name":"HAbKwgcCs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2300","Name":"jRoBFNNsm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2301","Name":"NACsWNzCi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2302","Name":"zQYRfYcfN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2303","Name":"oZTMbnsaI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2304","Name":"hRpsFpBzU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2305","Name":"FlnLWoIyG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2306","Name":"AQahwdSHg"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2307","Name":"CkZHtjIQq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2308","Name":"EPwnnBbwd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2309","Name":"NLPeLlWcH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2310","Name":"cvWYYcrTN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2311","Name":"LANmNSBVX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2312","Name":"gudIKGhLX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2313","Name":"YqoJpubaS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2314","Name":"vUaQGCIsH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2315","Name":"HgnqTDPlh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2316","Name":"LZHwMljHD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2317","Name":"AqyTDbeTo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2318","Name":"QtbOPbZyP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2319","Name":"BrTppusJF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2320","Name":"qZynvFXiE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2321","Name":"miTmaSNqF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2322","Name":"GwGtdVgQR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2323","Name":"nbpaNdGMV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2324","Name":"xPyxoxDfi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2325","Name":"ivrsyeKAU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2326","Name":"dnVrdhBsP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2327","Name":"zKeGfQsDy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2328","Name":"FbYlaglSP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2329","Name":"EAeOcpZkh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2330","Name":"vTIeekELD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2331","Name":"APhbUzqwn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2332","Name":"jTJoVPxlj"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2333","Name":"aorGHdrBv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2334","Name":"aumJlmYGC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2335","Name":"RevrHqayb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2336","Name":"woSLvkhVY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2337","Name":"VabAnNqUi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2338","Name":"TQwHTnJtv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2339","Name":"IZnesyYhb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2340","Name":"DUkSnqrVx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2341","Name":"uxgxKiSkN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2342","Name":"HXBFusFZn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2343","Name":"sRFMHfzVa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2344","Name":"FHctBLcTz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2345","Name":"dZouGoQHZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2346","Name":"CdzqabNhP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2347","Name":"eFmxBDTNY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2348","Name":"WKEeXCikR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2349","Name":"QtuwRaoEr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2350","Name":"eAGktxksz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2351","Name":"MtuwKQCUz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2352","Name":"vjlrPFkVi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2353","Name":"RSAzFNxIn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2354","Name":"omVHNtxvp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2355","Name":"mrPfDMWFx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2356","Name":"IZoVxRRbR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2357","Name":"ZbvEAirsF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2358","Name":"DuDKURCYs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2359","Name":"CCjFYGNEU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2360","Name":"MJyOiygFK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2361","Name":"MNMbYmDJC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2362","Name":"HmrQVGPZO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2363","Name":"YaImNGpoE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2364","Name":"eYjDJcLAM"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2365","Name":"InuuzXQpK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2366","Name":"BMlauuBwH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2367","Name":"tbZOyqJDu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2368","Name":"AUGhKSPdb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2369","Name":"sqiutNKUd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2370","Name":"YojgRethM"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2371","Name":"LyFnlTtBb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2372","Name":"aKQCMnUcw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2373","Name":"sxCzxpwEo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2374","Name":"PFlhxtbDS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2375","Name":"fWoNiqIuf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2376","Name":"GAbPKazaC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2377","Name":"YFGDPMQYE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2378","Name":"GqwkWgXWQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2379","Name":"nEKlkaCtI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2380","Name":"qLtSvlobx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2381","Name":"MsZLutlKj"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2382","Name":"wjJoYbTjz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2383","Name":"nSZruHsin"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2384","Name":"tajZVEXvR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2385","Name":"yQxQpzdxe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2386","Name":"bUoKWwpzG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2387","Name":"XvmFUcwwV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2388","Name":"VuUPgpLMd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2389","Name":"hgvglRtTz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2390","Name":"fcnkcpcpo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2391","Name":"fnkZWarzp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2392","Name":"gEODjvezp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2393","Name":"nACmfmcpc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2394","Name":"ZdPpHovms"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2395","Name":"clyeedMjW"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2396","Name":"dGkkxnOLS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2397","Name":"BYScAoyiP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2398","Name":"jBxVitADK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2399","Name":"SqKdbJKon"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2400","Name":"EmWhopPHH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2401","Name":"cganCdcje"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2402","Name":"bGpKwpuJw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2403","Name":"XnRKSCLyb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2404","Name":"TJJfoeZoT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2405","Name":"hTeKBpxNA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2406","Name":"qFPeApjWA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2407","Name":"wtPhVHzKe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2408","Name":"tUcZKsbYr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2409","Name":"pFDWogwBh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2410","Name":"sSvZiGQLG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2411","Name":"bfkuqLdmQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2412","Name":"LdDtNtBcT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2413","Name":"nzseVuHfO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2414","Name":"ozhlJyMQV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2415","Name":"DCFrVQhMz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2416","Name":"DUMsDnDGE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2417","Name":"vnXfVoVTU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2418","Name":"FQSQXiMcn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2419","Name":"yxyiMZIji"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2420","Name":"SkLppzbHy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2421","Name":"QLJgfNiEo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2422","Name":"nFGJvevXN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2423","Name":"nAzGBNzZT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2424","Name":"kRWZzIiGB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2425","Name":"yoiwwnulD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2426","Name":"MwoapvASK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2427","Name":"FzMrEIffY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2428","Name":"vxYfQsEVH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2429","Name":"YuSAveDPd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2430","Name":"TyWrpdZXf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2431","Name":"jnBWyubFb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2432","Name":"iUZiGaIlc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2433","Name":"TrEoPxSYE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2434","Name":"OJVIcZbqc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2435","Name":"qfnEobahg"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2436","Name":"HSNcgomkQ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2437","Name":"srgrtmgzT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2438","Name":"OHqfZZhSz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2439","Name":"yEeVyCmUR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2440","Name":"XuyRcuKgT"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2441","Name":"dyAbMKLlu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2442","Name":"McNZpajVk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2443","Name":"rKdEjpRml"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2444","Name":"ZeaoaCINC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2445","Name":"oKmXkQoyd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2446","Name":"suHMwQLeL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2447","Name":"UdalHqWLP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2448","Name":"YXIqAZpjn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2449","Name":"eIdeZgMkA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2450","Name":"OMfhCqzQv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2451","Name":"LVsTfTRwH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2452","Name":"vRomZfyni"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2453","Name":"HHLzFoeSn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2454","Name":"xQrNVrRMx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2455","Name":"WpMrwAtrB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2456","Name":"IrVhuxxfR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2457","Name":"dXGXeBtBG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2458","Name":"dYAvqzqsq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2459","Name":"oxyQygvyP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2460","Name":"fJyfjrDoe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2461","Name":"liulhPeNr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2462","Name":"ydCutkhLK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2463","Name":"ifNWAWgev"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2464","Name":"fTTQwqRdJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2465","Name":"psscUTpeO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2466","Name":"CelrBQISc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2467","Name":"TlMsnNrHL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2468","Name":"uHFeackwF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2469","Name":"WzNcTixDK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2470","Name":"OMOZVSkyB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2471","Name":"mZsSnSxpF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2472","Name":"BEHWxzlnE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2473","Name":"HuYSDOool"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2474","Name":"HPBGuUomI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2475","Name":"EgSqRtPbu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2476","Name":"yZYEQHzkI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2477","Name":"HXAvKhjAA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2478","Name":"tleycyCpt"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2479","Name":"ZcMbKPGGr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2480","Name":"nwjBEINwS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2481","Name":"zOeBJAjTB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2482","Name":"YHVdXKiOO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2483","Name":"alHWoeHzp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2484","Name":"CRmHXnlbR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2485","Name":"eatIYhCiF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2486","Name":"jjqumlCxz"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2487","Name":"iiUDwtTrl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2488","Name":"bKLRgRqwa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2489","Name":"dvPotFXmV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2490","Name":"iorqJZQOY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2491","Name":"QyNIwMmRr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2492","Name":"EbnVQnIsk"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2493","Name":"uiovESbHr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2494","Name":"UiVqBnKjs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2495","Name":"uGuMniuHt"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2496","Name":"OAPXROKCx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2497","Name":"PomNHbchI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2498","Name":"YiOcQznZr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2499","Name":"KpXUzooFu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2500","Name":"doFXhMaaw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2501","Name":"FFNcFTbSK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2502","Name":"yjKTfotEY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2503","Name":"ICzLBzphX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2504","Name":"XzzAuDgAV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2505","Name":"eSxCiSCBa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2506","Name":"cSnWIsxGu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2507","Name":"cXNiwjpMP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2508","Name":"oDMIyJVKK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2509","Name":"WmzSQJJCr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2510","Name":"mausyWWDA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2511","Name":"DnyhPldCi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2512","Name":"xgLitfKnB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2513","Name":"AUSPjbHiS"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2514","Name":"bIrIEgqug"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2515","Name":"OVWPpgmXX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2516","Name":"pliBRqjmU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2517","Name":"VxSGgcOdm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2518","Name":"DwugupSQi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2519","Name":"eRzZpCufx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2520","Name":"SlzygKXRh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2521","Name":"dhJaddJyA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2522","Name":"pnUqeSREp"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2523","Name":"cpORyZZdN"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2524","Name":"ObzxzcbdH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2525","Name":"ojzMfSuNc"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2526","Name":"LjVQzPmGJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2527","Name":"DRBFGnBBu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2528","Name":"pTHsadTCM"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2529","Name":"KxuqsbNHZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2530","Name":"DozxDfHge"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2531","Name":"nmUFJSlrP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2532","Name":"zMAsxGCKf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2533","Name":"PQtiSWEzR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2534","Name":"NqssQyjkU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2535","Name":"vbvoFAynh"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2536","Name":"UxLPtbRNC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2537","Name":"dPUBuoOyE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2538","Name":"FpEtBumHP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2539","Name":"Kitzhmdeu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2540","Name":"SkuxIpFyi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2541","Name":"sQWIPlNHZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2542","Name":"eRdzqOJLX"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2543","Name":"KlXwGdQud"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2544","Name":"EmwvnXdbr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2545","Name":"VuKGgAFRZ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2546","Name":"LvGdgNIgw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2547","Name":"ENDOPpAAK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2548","Name":"YZfnnqZxi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2549","Name":"wNFgfRoYs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2550","Name":"fsuEUuStf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2551","Name":"MTejfzVFe"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2552","Name":"tgoqCCeOu"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2553","Name":"mYVErjFgv"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2554","Name":"bGkeBqNav"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2555","Name":"NmGWnjUtR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2556","Name":"NyEnIUHcr"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2557","Name":"MEdpujANG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2558","Name":"YgqCruLNF"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2559","Name":"yGMgLXXEx"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2560","Name":"ziippulqi"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2561","Name":"GjIYJcvHB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2562","Name":"wpuyOgdqJ"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2563","Name":"OkIhOgsZd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2564","Name":"EcJuktdCG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2565","Name":"AKPETtkvH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2566","Name":"xbNhSSlON"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2567","Name":"NCacWpELY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2568","Name":"zBvvwFUXb"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2569","Name":"moxbyQVVB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2570","Name":"purnsOcrP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2571","Name":"hsmWbXAzt"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2572","Name":"ElpdaghOE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2573","Name":"lNNPlHwQB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2574","Name":"zrSEEdrkB"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2575","Name":"kWpTrTerd"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2576","Name":"ONwRKCJTR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2577","Name":"HVsgVhfpA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2578","Name":"YWyOJZhod"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2579","Name":"WUWLxRFWo"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2580","Name":"NRmCZWNRy"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2581","Name":"AxHrxhhMG"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2582","Name":"JHNNubBtU"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2583","Name":"BoHNKEJSl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2584","Name":"DFZbaaeLD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2585","Name":"meDuiXIar"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2586","Name":"qjRVytJag"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2587","Name":"zMKGfGPDs"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2588","Name":"wpwvehyai"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2589","Name":"kuAXOiwpM"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2590","Name":"CvarzAjFC"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2591","Name":"ORXsmiGqV"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2592","Name":"kCgrSSaWf"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2593","Name":"rSYzBBkSD"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2594","Name":"RVkgZgqkY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2595","Name":"HrWWXmxhH"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2596","Name":"BMirGvRFO"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2597","Name":"iWAYVQuhL"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2598","Name":"tHZHozoJa"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2599","Name":"EobxsLfTm"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2600","Name":"arkNstbDq"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2601","Name":"ieYUqwxKI"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2602","Name":"GyMibVmhE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2603","Name":"CsHJznjoK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2604","Name":"cNPbQeIZP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2605","Name":"jlhXlGhHA"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2606","Name":"ExUpliRxE"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2607","Name":"AuZkPXggl"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2608","Name":"XvwKotskK"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2609","Name":"PyOykkGgR"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2610","Name":"xdCLyUgTw"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2611","Name":"lYWfOEloY"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2612","Name":"wmAnGLkFP"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2613","Name":"waBtcABOn"},"emitted_at":1673989571000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2614","Name":"qUOzRNWHK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2615","Name":"dhUBBkNCJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2616","Name":"sHlAheEgm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2617","Name":"zPfzHsAzg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2618","Name":"JNExBHWFb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2619","Name":"cBizqkfHa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2620","Name":"JaVSznfJC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2621","Name":"TYIPOkrgb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2622","Name":"EpCmBVStE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2623","Name":"cytvVgCGt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2624","Name":"RfVmQSFEX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2625","Name":"kekoyivsk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2626","Name":"tdzArqZqU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2627","Name":"STQVYySAo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2628","Name":"qNRgztmwu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2629","Name":"FxJbaHPqe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2630","Name":"ZLjnWxcdP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2631","Name":"GBXPcMhHe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2632","Name":"XCrvpWRZD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2633","Name":"ITRgzNSmT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2634","Name":"iQcLfPrNK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2635","Name":"vTbcEPEnu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2636","Name":"CluKgYzWC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2637","Name":"QwKMClkRS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2638","Name":"jVSiTkiOg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2639","Name":"dtiDfaDiB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2640","Name":"xYpArrCbv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2641","Name":"uJeEJDuUN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2642","Name":"MrmYWAADB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2643","Name":"fpRLFfabc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2644","Name":"uHnSghMSw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2645","Name":"mYIGcBBop"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2646","Name":"NviSEGoCu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2647","Name":"HQnEeWRhq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2648","Name":"nunnOjklZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2649","Name":"iBkFywzCJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2650","Name":"SFBLaKrOg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2651","Name":"QQLZECMUO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2652","Name":"wXHtgETIH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2653","Name":"QFFWQVxNW"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2654","Name":"VLTTHBrSA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2655","Name":"zoTgMCBpG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2656","Name":"dJkUxyHcJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2657","Name":"WsDCfjVjR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2658","Name":"IRqDptXBg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2659","Name":"QmmhfvOaQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2660","Name":"wmDKwUAXv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2661","Name":"tAELUDntc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2662","Name":"FcoOLKkOD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2663","Name":"YXSGUdvbv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2664","Name":"mIXcxavSh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2665","Name":"lTuBCtVib"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2666","Name":"ngFfZugdi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2667","Name":"GHThybivy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2668","Name":"RfTkuFnlB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2669","Name":"SxDNtaCZo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2670","Name":"YgdVWUVQD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2671","Name":"nxGLSOWhs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2672","Name":"HKmLHPARs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2673","Name":"vqZLDvtil"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2674","Name":"yrjMPtsbJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2675","Name":"sBlpYnbND"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2676","Name":"vCwNEuhCf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2677","Name":"JbnjNZama"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2678","Name":"gIJydagnM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2679","Name":"XaMZnggHu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2680","Name":"YcPoGucCx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2681","Name":"DgLUpVADq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2682","Name":"RNmvhcRUC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2683","Name":"KsGNtMSGo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2684","Name":"sSeuDsASY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2685","Name":"KOcclNTFh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2686","Name":"qMTnXUKqD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2687","Name":"XwsmdLJQx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2688","Name":"VpdFLsaCb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2689","Name":"KFDtWwsYY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2690","Name":"uSuGmTHUi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2691","Name":"pNsXWFQyg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2692","Name":"cDSvTboPz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2693","Name":"GxZVwsDMc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2694","Name":"yxEohZDmJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2695","Name":"uHRLwPgrm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2696","Name":"OYFNiKays"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2697","Name":"VtRsVUleR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2698","Name":"JPEVbxqaj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2699","Name":"KahwmtGaQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2700","Name":"ivtOFVfMl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2701","Name":"hoioinoHG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2702","Name":"fCjzKbarm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2703","Name":"NIGzjgtiP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2704","Name":"FMBNeqvEa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2705","Name":"DwDGvWhhq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2706","Name":"YJbnsPEQI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2707","Name":"qjoHvZcKQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2708","Name":"joFKmOKOG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2709","Name":"gojHcBBKR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2710","Name":"dftyuayOb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2711","Name":"kxowpHqEB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2712","Name":"cSbapwZJY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2713","Name":"YuabFXsrI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2714","Name":"HzURkZCCe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2715","Name":"YjXeOsUnO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2716","Name":"agHyJbppa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2717","Name":"phMbgLBhw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2718","Name":"EUeOaYiTA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2719","Name":"qkgxTjMuD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2720","Name":"UdhfAIJjF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2721","Name":"OyNXPBNeK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2722","Name":"BgihGfGEB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2723","Name":"OOUcTEjMA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2724","Name":"dGWvQLOoN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2725","Name":"DmYyxWVtl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2726","Name":"tnXbXnorF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2727","Name":"NnXNHBuoH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2728","Name":"JWwYcYHmb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2729","Name":"KeCZSewDp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2730","Name":"msFaIYIxN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2731","Name":"MiFBuTRnD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2732","Name":"achLXmlxp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2733","Name":"cWETfDAYr"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2734","Name":"rbNqbkTHH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2735","Name":"XLNhAqKXd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2736","Name":"mZZtKJyxB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2737","Name":"PENJCrlxb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2738","Name":"TOzgzOdPo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2739","Name":"NwOPaQBXK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2740","Name":"asmlMirmb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2741","Name":"rluKkNPsL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2742","Name":"sfETBsWKK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2743","Name":"pekncvtlE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2744","Name":"EQTHFdnpo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2745","Name":"cMSTgGJPa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2746","Name":"VeWpEXBbw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2747","Name":"khHlZHvVV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2748","Name":"xNuCsIkGu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2749","Name":"MPpJmVaBF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2750","Name":"OhRcacjwP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2751","Name":"ozSIhrAed"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2752","Name":"kaPVltKKB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2753","Name":"IrNiNZoRX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2754","Name":"WyakdblPU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2755","Name":"voGjWjMRF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2756","Name":"RmACWdvLr"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2757","Name":"shutIZpWe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2758","Name":"UgWUTbroC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2759","Name":"wMAaVDagD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2760","Name":"uBRWIwMaJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2761","Name":"WeECPBNvC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2762","Name":"UVqYeGgHo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2763","Name":"tjKJIonUc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2764","Name":"kJDLYmGRy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2765","Name":"PjGfzyiUn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2766","Name":"loAnAvxdY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2767","Name":"mEYrAXiUV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2768","Name":"xzMbtKiPw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2769","Name":"BWkcydzDo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2770","Name":"oRzLwxocE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2771","Name":"ngWhFFVEg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2772","Name":"wBNwJQOGL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2773","Name":"YCNNruxIB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2774","Name":"EskXwrvkX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2775","Name":"TdbpcfznA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2776","Name":"nnYFdwbUF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2777","Name":"oRUDKIteO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2778","Name":"aSjXeYQeN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2779","Name":"eGkUhKXiM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2780","Name":"tLgBIrzuA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2781","Name":"drIOVlYmq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2782","Name":"kipMWLgAL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2783","Name":"SEVargldk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2784","Name":"qbLGvMveE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2785","Name":"oBglwthbd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2786","Name":"AXTSGfLbL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2787","Name":"PAKplbPCj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2788","Name":"ODMmISzuB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2789","Name":"sTpaekTzc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2790","Name":"xYTiFnubB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2791","Name":"IrZxxzBRR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2792","Name":"NldvksqxI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2793","Name":"JcyAmoriM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2794","Name":"wwGVUaYaL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2795","Name":"BodauoNxG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2796","Name":"zLvliOHna"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2797","Name":"UHZbHfALG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2798","Name":"jlRZaPwJT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2799","Name":"DgqtarvOZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2800","Name":"KRRNbhmEK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2801","Name":"KTJpJZGhM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2802","Name":"vjtfmUwjX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2803","Name":"FypeSdFrT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2804","Name":"UziCppiYe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2805","Name":"YkcDOWACW"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2806","Name":"qljHIfHwy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2807","Name":"gExrloWSo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2808","Name":"bgyQEwiQp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2809","Name":"opWkjFvnU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2810","Name":"KZANtCExV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2811","Name":"VhnaKCZea"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2812","Name":"pUcywdWZj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2813","Name":"BbZNUxFKa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2814","Name":"JQoGhgvJc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2815","Name":"MmpEKIthQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2816","Name":"INDyYGfMV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2817","Name":"ywjryVcfA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2818","Name":"phsaMpwGs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2819","Name":"blbGLOCHh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2820","Name":"baDSypPRz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2821","Name":"mMKErpVeP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2822","Name":"xRDagOmLF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2823","Name":"WSZSdsXlV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2824","Name":"oOvpzvcbP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2825","Name":"fUGtfAduY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2826","Name":"HMOXKkzGp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2827","Name":"uQoGaCeND"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2828","Name":"neSwFpkTv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2829","Name":"awpZkTwpS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2830","Name":"LVauxButb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2831","Name":"mluqqwTSK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2832","Name":"nBsgJEYMZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2833","Name":"djVdiuWBK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2834","Name":"njyuFEiQo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2835","Name":"jkHHyCrhD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2836","Name":"RUOgFtlFI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2837","Name":"sxjwynozR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2838","Name":"gISWcfwQx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2839","Name":"lRIPVzZSM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2840","Name":"osENilMBd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2841","Name":"NmSzSTMUE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2842","Name":"pUvQNzRiw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2843","Name":"VAUnRQNYi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2844","Name":"hTWgXfreN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2845","Name":"XZXVLyUyS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2846","Name":"IclqcbJWg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2847","Name":"jpXdmSOXq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2848","Name":"NXgCKwDbC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2849","Name":"vfwrtLbuU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2850","Name":"LiVRCRWcn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2851","Name":"uhKWOKyZT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2852","Name":"ZciIQCNRQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2853","Name":"jMGyGlcVG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2854","Name":"YoyrJJCxZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2855","Name":"vMCBjOnCt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2856","Name":"iLPPNnAmz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2857","Name":"wTpQldfMj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2858","Name":"vsycMBCFa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2859","Name":"SeSlqyLHZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2860","Name":"jjngiNTBE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2861","Name":"wOyLHBUJz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2862","Name":"zTrWqRUgO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2863","Name":"oAoDieFDl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2864","Name":"OvddfTPyh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2865","Name":"FJDijpOZC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2866","Name":"hHOJtoeUf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2867","Name":"skrhODavX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2868","Name":"ukodCVsyp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2869","Name":"LmoouqjHi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2870","Name":"SDVMSBlAu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2871","Name":"inqZkyqtB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2872","Name":"ZsNlVxoHy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2873","Name":"TaDTOzmlv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2874","Name":"mhNoMTZxu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2875","Name":"IYyPTvisF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2876","Name":"wyjmdwQur"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2877","Name":"kMnVmsERA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2878","Name":"qmvlPAseE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2879","Name":"sTnpADMdv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2880","Name":"PsXsCArDH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2881","Name":"tBArWQTfP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2882","Name":"gYyKwjfTd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2883","Name":"WqtaXrhFF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2884","Name":"hKNkzADNm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2885","Name":"TOrLHpTWu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2886","Name":"VRLjbIzQh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2887","Name":"rLerigpMq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2888","Name":"ygxZNmKkw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2889","Name":"LOuphNGdy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2890","Name":"qsfuFaoUw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2891","Name":"NrCpYkMEm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2892","Name":"nmjbeaBGW"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2893","Name":"qictDSqje"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2894","Name":"ybMdsljvP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2895","Name":"TVSgeLLDM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2896","Name":"wBfOawsPA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2897","Name":"xqCNmyxOa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2898","Name":"XIcuNSahK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2899","Name":"wFPRWYHCs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2900","Name":"zCUXelSdl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2901","Name":"EcxSrjKEU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2902","Name":"KNgRSdPpd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2903","Name":"kLqERnRBz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2904","Name":"MQPlQQtjI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2905","Name":"GkSgKfCPc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2906","Name":"SRromUEGr"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2907","Name":"wqhSFClpJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2908","Name":"TzdCQFrlP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2909","Name":"AvxzqBGyg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2910","Name":"mCFWPBtiX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2911","Name":"PbTBGKIkI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2912","Name":"riZAHzoKC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2913","Name":"oEXqeTXfK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2914","Name":"yOFVLtpBo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2915","Name":"nchXWILys"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2916","Name":"CsHdeorXK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2917","Name":"slSnqrhDs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2918","Name":"BPshAyRga"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2919","Name":"paOxLHCwG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2920","Name":"qHEGrUOsH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2921","Name":"tBTMCQrhC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2922","Name":"UrpsPMmoJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2923","Name":"WxQlQtPsn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2924","Name":"EpFMHHbBZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2925","Name":"JDjSJPXGg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2926","Name":"heZfnYmhl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2927","Name":"orlFQQqzx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2928","Name":"fbBgikmSU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2929","Name":"LtWZxECRM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2930","Name":"odBIxnBVq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2931","Name":"WAPavFNhC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2932","Name":"zjAzTAwpO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2933","Name":"MqjpvqOqs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2934","Name":"QoYKbxsYO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2935","Name":"MZOscphwA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2936","Name":"DhaWpOoCB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2937","Name":"nylcxoZGm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2938","Name":"uACkkOrbc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2939","Name":"IEHtpBUVc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2940","Name":"DJrZgFtlA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2941","Name":"wUrIVSVfK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2942","Name":"bxJEAimnn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2943","Name":"NODycXnpl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2944","Name":"XSnSZlkqA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2945","Name":"xsmSPOKwo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2946","Name":"xzeqmYCts"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2947","Name":"wkykRkqao"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2948","Name":"akrYNBNHC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2949","Name":"XGpCvpnLf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2950","Name":"kHxjolhWc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2951","Name":"QquXNBjLb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2952","Name":"XpUbgQjAM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2953","Name":"XrjghLNli"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2954","Name":"HoGOxpzmm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2955","Name":"AgjxOJSfa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2956","Name":"VwBHQVqvg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2957","Name":"qVvNDFMvQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2958","Name":"dvMhkbbao"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2959","Name":"ENGyHlMyT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2960","Name":"XdccYbDOS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2961","Name":"WFUfVWUuc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2962","Name":"XNZOmTMCk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2963","Name":"DCVJWyliJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2964","Name":"rQsPXmBWA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2965","Name":"KRqSVfiCf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2966","Name":"ePnWINKiy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2967","Name":"JdvrEhUZV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2968","Name":"TpuduGEsN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2969","Name":"HAtgsbWnh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2970","Name":"IBbmIhqSJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2971","Name":"ohLjvoyFa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2972","Name":"ehnpURFsX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2973","Name":"jwSlPSPfx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2974","Name":"AZNRwILbk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2975","Name":"iUlwZqDgR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2976","Name":"SdWhhHDON"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2977","Name":"DgDKCrWCY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2978","Name":"GZHAbvfWU"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2979","Name":"UnblmiQRd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2980","Name":"PepbNsKpi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2981","Name":"FNnGKvjFx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2982","Name":"bZLfRUVuw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2983","Name":"ehpVTLpiS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2984","Name":"ySUYLakGY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2985","Name":"frGkBkknV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2986","Name":"nSkYUdPpv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2987","Name":"pweepEoEo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2988","Name":"OqgLrHbnF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2989","Name":"FvjiLZPiF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2990","Name":"CZLWfrETx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2991","Name":"QyOFTlHVQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2992","Name":"HjGUMcIhn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2993","Name":"WPbGfaWgs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2994","Name":"QfxdkUOUQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2995","Name":"cCuLLpKBF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2996","Name":"lchWnbNVM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2997","Name":"fEQYjbPiT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2998","Name":"ebpFCpvst"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"2999","Name":"SjUSWDJvw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3000","Name":"nMiMSMTvE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3001","Name":"HPdFcYLCo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3002","Name":"NWoiawFeP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3003","Name":"fRcfIaAEb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3004","Name":"gJxNITAov"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3005","Name":"AOYcdRZJM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3006","Name":"OKuhsiAvq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3007","Name":"tXHEvrmdL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3008","Name":"BEbdoJgrL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3009","Name":"FgouctPTJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3010","Name":"FIyrZUJSP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3011","Name":"QxgJxeRPT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3012","Name":"jwzgJkVec"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3013","Name":"pvlSCsLlo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3014","Name":"vVLVLhHFL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3015","Name":"UoLhgswEB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3016","Name":"rruImqlmu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3017","Name":"vMmaHXHxg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3018","Name":"oZRcqNMXg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3019","Name":"mCUdiuDKl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3020","Name":"lAtbXfLfr"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3021","Name":"VcglPLLvy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3022","Name":"OIVnhOFke"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3023","Name":"HGRbhFLzK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3024","Name":"ThEuKDjpX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3025","Name":"lZNxpFdqe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3026","Name":"owoMpNaBa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3027","Name":"GmDyBLakq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3028","Name":"JLFjVAkQt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3029","Name":"cNoXATNdy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3030","Name":"shambAUiF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3031","Name":"ubOQslUyz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3032","Name":"DsCURbrYr"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3033","Name":"dkXKXAaHq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3034","Name":"HvQMDNxqh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3035","Name":"NIdFPWKhz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3036","Name":"jKRGnzykA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3037","Name":"JSEezyrWu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3038","Name":"UDflxmqjf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3039","Name":"LwAWMlBDt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3040","Name":"UeadRGxWD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3041","Name":"eFMAruGDQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3042","Name":"ihZlypAQs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3043","Name":"BycAzaGMG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3044","Name":"hGCwCODjf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3045","Name":"zsxAIsCBy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3046","Name":"pRvjJLdDw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3047","Name":"dclnzEsDs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3048","Name":"gnmZaROtB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3049","Name":"SXjIGLCzt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3050","Name":"FeIOWGRCY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3051","Name":"mQfQXVomg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3052","Name":"stOCxSYET"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3053","Name":"dqZohozKu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3054","Name":"zlgtBbKUF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3055","Name":"QtIYqzkwB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3056","Name":"jyRxLyMpt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3057","Name":"UEndwDhWb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3058","Name":"yMrNdakoc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3059","Name":"QOltXxBaR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3060","Name":"OrQymoZIu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3061","Name":"AvLEblGHd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3062","Name":"aFfEnwcOT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3063","Name":"GSULhkkBI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3064","Name":"ALOhBRwog"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3065","Name":"aDdHGWlNG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3066","Name":"QgshlQSmM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3067","Name":"CUvxCPlkj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3068","Name":"igWEuXaRx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3069","Name":"NtxfuZrfM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3070","Name":"bpgvvJzoG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3071","Name":"OaKeuugYE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3072","Name":"tiypnBlLV"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3073","Name":"gdoIZKoZB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3074","Name":"sqWEwcASs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3075","Name":"scdgtEvaa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3076","Name":"XTUhxuyle"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3077","Name":"VFTyEsyip"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3078","Name":"MYSzorkAL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3079","Name":"pWfrNeeJy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3080","Name":"IHTAMnnwz"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3081","Name":"FMHTiARHk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3082","Name":"PZRefBLkT"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3083","Name":"fwwRtizwP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3084","Name":"cYrCwmYjj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3085","Name":"GQcBdDWMj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3086","Name":"EFJqazXmc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3087","Name":"gfubYmLaH"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3088","Name":"tHWivedPK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3089","Name":"BcREzTMsN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3090","Name":"wmHsJJfDS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3091","Name":"tZzKsTbDE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3092","Name":"lxhoaLwVD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3093","Name":"kIdpFMSAm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3094","Name":"REhGmXzRD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3095","Name":"zeisHPSma"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3096","Name":"sErKoPzSX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3097","Name":"mzGwhFtLy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3098","Name":"SdSSEPmyx"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3099","Name":"SjOQzfLZE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3100","Name":"coRZTyRkd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3101","Name":"DYXoCovIP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3102","Name":"FtbdIVlIk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3103","Name":"rbLPIpczj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3104","Name":"jHlWAgppY"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3105","Name":"lOaPFDIaP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3106","Name":"JkAmEAwtS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3107","Name":"efhzHlpMP"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3108","Name":"VhYyKUNju"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3109","Name":"ACxNyGXao"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3110","Name":"DKSmAdGqZ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3111","Name":"dHMbTMfep"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3112","Name":"EsdsCobAf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3113","Name":"bRnkwinsi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3114","Name":"gUDqzkqgl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3115","Name":"TgDVMufie"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3116","Name":"axrDpJOJk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3117","Name":"UVaHNvZAs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3118","Name":"NVZSgFCnm"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3119","Name":"KZHRHPjrO"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3120","Name":"TImcNGiuD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3121","Name":"AupyvLeVc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3122","Name":"jjXQJJINE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3123","Name":"kWMdmkKdo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3124","Name":"ZbcAZxioC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3125","Name":"CpXQlNhfk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3126","Name":"zROrbqDQw"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3127","Name":"sBFydEhkd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3128","Name":"fNCPjmVUu"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3129","Name":"GQyvbbBkF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3130","Name":"mDlzHmfxM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3131","Name":"BpQYwiGjv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3132","Name":"YkcyJccEe"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3133","Name":"CvgRFGVWR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3134","Name":"umqzTXJnA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3135","Name":"NmFkatcyE"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3136","Name":"oyYgoipOF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3137","Name":"iaOiKRzCG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3138","Name":"MNZpCTaSK"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3139","Name":"pUASHlKrn"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3140","Name":"tcMAXAULh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3141","Name":"raGoFVsSg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3142","Name":"bvDHypWVf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3143","Name":"CrWPVrVlN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3144","Name":"DYbamxavf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3145","Name":"YIWbaDoYg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3146","Name":"LKunhLrED"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3147","Name":"pIFikQOdf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3148","Name":"bvyiZgQgb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3149","Name":"ltPYoTLyG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3150","Name":"HoQuotaEb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3151","Name":"ygBhSkHur"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3152","Name":"kQfDraTFD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3153","Name":"zBrgzoaIj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3154","Name":"VmAsDmchq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3155","Name":"HGXJiFtuS"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3156","Name":"AuEWHkPEc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3157","Name":"YUiNuUwsR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3158","Name":"fHtLqyGxi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3159","Name":"ZahsTbMdF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3160","Name":"YYMZtfMml"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3161","Name":"ZrXwddGLa"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3162","Name":"rEZNrVGtL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3163","Name":"nGESrTCbt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3164","Name":"XixEgUmxG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3165","Name":"KFZlWKWnL"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3166","Name":"ktdOkkFPN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3167","Name":"TWmuBoaXD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3168","Name":"KjYthsuzG"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3169","Name":"xFagdGolD"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3170","Name":"SsTZZFfVl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3171","Name":"niXnWWgmC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3172","Name":"yIwfsNUhR"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3173","Name":"YygwkhWbc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3174","Name":"wxhDcACKv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3175","Name":"WlwxserSs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3176","Name":"VLwRsIwwl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3177","Name":"kSOwjjvQh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3178","Name":"mwLtMpEOi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3179","Name":"GGxpsKQil"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3180","Name":"YtUXGTgDA"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3181","Name":"UydEoMGhj"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3182","Name":"BLOqVGKWo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3183","Name":"ZNbcvpnjq"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3184","Name":"KiYYSoHGB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3185","Name":"QKydmlPsv"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3186","Name":"FYbEwmWMi"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3187","Name":"AdKwCtBjo"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3188","Name":"NbjynieQB"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3189","Name":"txBpBkjPy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3190","Name":"wfcDhWBFg"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3191","Name":"WVAZkkCKh"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3192","Name":"NprEaQThC"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3193","Name":"CzOvQauyQ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3194","Name":"FIsrqpTAt"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3195","Name":"yWQPjKKAd"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3196","Name":"ZAcUAqJLX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3197","Name":"TtWLzqMGk"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3198","Name":"AEIIVTXop"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3199","Name":"RcTftEqRJ"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3200","Name":"BiiUglpBM"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3201","Name":"IlGHHsGBc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3202","Name":"LGggkMQgs"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3203","Name":"tOkRlTMBf"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3204","Name":"LbInnvZlX"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3205","Name":"rjWkRyLEN"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3206","Name":"OXVtYmnQc"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3207","Name":"WMmrfVWSy"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3208","Name":"LSoUuyTQp"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3209","Name":"qzZDVpMux"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3210","Name":"YdzThQaij"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3211","Name":"dALhWeday"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3212","Name":"FCYVGeycW"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3213","Name":"eKdZbnCOI"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3214","Name":"TdetgXfVF"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3215","Name":"WQQDrRgwl"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3216","Name":"isZkRDdtb"},"emitted_at":1673989572000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3217","Name":"oQTeoYANr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3218","Name":"KDaufgAmV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3219","Name":"tbTAKdiec"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3220","Name":"yCHicXzPJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3221","Name":"XhORrSoMT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3222","Name":"ajXyZmVgw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3223","Name":"SwJlNRMpN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3224","Name":"NAEfAGgNw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3225","Name":"lVziTPqNN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3226","Name":"KNvKxrRGg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3227","Name":"OYveswnWA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3228","Name":"IycoNFUnC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3229","Name":"NBfeRDhsz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3230","Name":"dWOcywfnP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3231","Name":"FruobOlDK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3232","Name":"hilCvaacS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3233","Name":"SrxdZDlZp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3234","Name":"aUhXTsfTN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3235","Name":"AtSpMUfcB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3236","Name":"ixadJmMgh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3237","Name":"hPiVqWtRo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3238","Name":"TRyuzyTJs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3239","Name":"bFzXMytik"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3240","Name":"yBsqPZyfC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3241","Name":"EjnDkIhYm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3242","Name":"abQWcETxT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3243","Name":"jQdUQOOvr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3244","Name":"BSpOPBXaj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3245","Name":"msyNPkfzZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3246","Name":"aPghqEuva"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3247","Name":"rHmNMgjjU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3248","Name":"YcmNOrAnj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3249","Name":"HVRpNmAhn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3250","Name":"jvmMrnKtK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3251","Name":"YBngGghPy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3252","Name":"JFWeSVvoN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3253","Name":"hPYDKmAsc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3254","Name":"MuqeWOKOc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3255","Name":"YJkukDACz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3256","Name":"EYfDfeYBC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3257","Name":"gfNqrETrZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3258","Name":"jhNIdwiWz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3259","Name":"ndPiDPOJQ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3260","Name":"SJCQCuTOp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3261","Name":"lApLrTThY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3262","Name":"FfJoNvUss"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3263","Name":"lZopqBrjx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3264","Name":"rgrJXCsLg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3265","Name":"XCbgDrIkj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3266","Name":"ebAEDtbQd"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3267","Name":"tzNKDpfcY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3268","Name":"BWOAjCfSS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3269","Name":"MAUlejehr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3270","Name":"DcsoAaWPO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3271","Name":"ZdUfbqSgT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3272","Name":"MKUMqnaCE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3273","Name":"ULFwZASlF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3274","Name":"TYikiqTTE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3275","Name":"LnIHuiBwn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3276","Name":"BLzyfcJeO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3277","Name":"TJqGgfcVp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3278","Name":"qaiqsTBDy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3279","Name":"gegylkFwz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3280","Name":"lpOdnVsgF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3281","Name":"ZXeTMMMAf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3282","Name":"nsaIsWRPF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3283","Name":"gfMcVZhph"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3284","Name":"wJignFnId"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3285","Name":"zgskegrui"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3286","Name":"guhGmmTic"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3287","Name":"UPhYxxAOM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3288","Name":"lfFWFtDzt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3289","Name":"tFSGkvcTD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3290","Name":"EUeCcqPTn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3291","Name":"xSRMjCelP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3292","Name":"qzILyfhHd"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3293","Name":"McvNnMaPL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3294","Name":"VonBiQtch"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3295","Name":"QpyCmMvDL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3296","Name":"VeOEhMMcg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3297","Name":"GbflLHSFj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3298","Name":"crGrAepNT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3299","Name":"yhWzIzVrC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3300","Name":"SEaWOxNZy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3301","Name":"FnITFaYVn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3302","Name":"OEitnsMho"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3303","Name":"lYdEofYWt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3304","Name":"rAqiWKEad"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3305","Name":"EpttZrmUX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3306","Name":"ImWIswPMc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3307","Name":"EUZEulDfX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3308","Name":"CzjVIAwHH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3309","Name":"FCuKrPepn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3310","Name":"pNUljAaEh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3311","Name":"VhmRovlPo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3312","Name":"TYSYgpDHL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3313","Name":"csJJdohMs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3314","Name":"bGLHgfhbq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3315","Name":"FVTrGrZuO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3316","Name":"udSckEHak"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3317","Name":"ATpcVMtoZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3318","Name":"RmOKhwbaI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3319","Name":"hhwjNLnBL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3320","Name":"GHXzVNzNl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3321","Name":"ZdyZJtJMJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3322","Name":"eeXoyubFf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3323","Name":"jQHuLkfqK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3324","Name":"tsfjGQxQw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3325","Name":"LPnOyprrp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3326","Name":"aflOlfTFd"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3327","Name":"sNnhtmNYH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3328","Name":"UdAQVpMRz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3329","Name":"KSZUasUAK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3330","Name":"xyrfhTUZx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3331","Name":"ygTLehNVK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3332","Name":"fyKSmSaOw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3333","Name":"cLMQMCzSx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3334","Name":"JPkIwFeEg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3335","Name":"EYYmJigYz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3336","Name":"TLQuHyOPu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3337","Name":"TAZSKzIYr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3338","Name":"KnizlFHgw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3339","Name":"gLPJUlPEq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3340","Name":"uROCAcLzh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3341","Name":"UchBWIXKf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3342","Name":"nyjdycVHW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3343","Name":"XFgBifqhF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3344","Name":"tGYAEcqKP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3345","Name":"kIZRMxghr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3346","Name":"BNDwStEom"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3347","Name":"dRHwLedWI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3348","Name":"cJciKWxUh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3349","Name":"IvEKaBnMl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3350","Name":"sphMPMDJW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3351","Name":"SUNiWtzrL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3352","Name":"AivmnTRuY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3353","Name":"TYilKlSCL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3354","Name":"jvmJPLLqm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3355","Name":"YZERGdtij"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3356","Name":"boyoqhvoO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3357","Name":"XXxtZaOHl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3358","Name":"nAkHnVIzs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3359","Name":"jmjZLwJOe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3360","Name":"gXWiUmKAD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3361","Name":"bzTihuaRZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3362","Name":"xpDUOoRlW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3363","Name":"DaBGbPWGf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3364","Name":"uAXyJpHRV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3365","Name":"rhEpkuObH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3366","Name":"USGeNvRQx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3367","Name":"UCOhojunW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3368","Name":"xavscsliT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3369","Name":"MExlIncMv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3370","Name":"gteYPwoxz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3371","Name":"gSBlfrbpr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3372","Name":"VJAffEBvO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3373","Name":"EjZpTjEES"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3374","Name":"XQEXoqFrM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3375","Name":"AlctOMiKN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3376","Name":"tqhSrNJOH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3377","Name":"nKYvUMPMj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3378","Name":"aYgZnsRsL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3379","Name":"tjvqXHovy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3380","Name":"LBUXszDNv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3381","Name":"GXygtKzZt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3382","Name":"ikQrdYmZV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3383","Name":"qkBFOpfLe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3384","Name":"psioolQlj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3385","Name":"DnkBJzPPe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3386","Name":"mVYSvnwJb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3387","Name":"XgeVlZpbg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3388","Name":"EGkSjHgqt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3389","Name":"AXRqOolDr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3390","Name":"dFwOefekO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3391","Name":"rHwXjVrae"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3392","Name":"UWvvDNwDz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3393","Name":"wbszSxTIb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3394","Name":"sRxbmMizt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3395","Name":"UQhqgzEoc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3396","Name":"zSCXKqvHV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3397","Name":"sQnCqoecu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3398","Name":"aBfAKMHGX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3399","Name":"OPqoNpVmC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3400","Name":"RYODziqCl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3401","Name":"pBkwwGBaO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3402","Name":"FptviBGln"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3403","Name":"hhfCQrbAX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3404","Name":"dZGbGiSbs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3405","Name":"IwPWdDjBR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3406","Name":"KdIKIhrxy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3407","Name":"KQsxdConR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3408","Name":"NIvmoRNRK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3409","Name":"YNgfDIaNL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3410","Name":"WBzveDAEf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3411","Name":"AloFkBqgK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3412","Name":"TESNfSxtj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3413","Name":"QeusLTVqM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3414","Name":"rkkidOxel"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3415","Name":"qQHVaVYVG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3416","Name":"WaBmiabsM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3417","Name":"mTCpcJOGB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3418","Name":"LuSGsXckH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3419","Name":"kLCqfvgUH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3420","Name":"reSzpirBH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3421","Name":"cbWNggZFG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3422","Name":"ygrNdejnn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3423","Name":"WAKYvDeFj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3424","Name":"GqyVuHrww"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3425","Name":"yPKBoCfWy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3426","Name":"TdZGCdKbX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3427","Name":"WJJtSXlqr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3428","Name":"eTGRyWNyz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3429","Name":"kqnWejHkt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3430","Name":"tmWbHSZta"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3431","Name":"axQfYoqst"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3432","Name":"ZvkwkDPGS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3433","Name":"MlZcwPDkT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3434","Name":"xXJyfQJCg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3435","Name":"WRSfNhNbZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3436","Name":"FNbvbRxEa"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3437","Name":"LZOOMAznZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3438","Name":"aEVLpxtyp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3439","Name":"ZUQNXJTNH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3440","Name":"RCdPExOlL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3441","Name":"pGTPjuKsr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3442","Name":"lHaMtRokt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3443","Name":"aabNuZHpc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3444","Name":"eHqpTOQgX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3445","Name":"IZZfmoani"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3446","Name":"izhUvBmul"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3447","Name":"ANaOIuxyv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3448","Name":"vsfesbWwY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3449","Name":"cCEJYuyOi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3450","Name":"PTwtyvvGn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3451","Name":"LqoKACqDs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3452","Name":"hDkMtrcil"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3453","Name":"QXjnhNgEM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3454","Name":"olmYnkWXW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3455","Name":"BGGoHpYwr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3456","Name":"yXWqVddsH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3457","Name":"ZzRlQlbDW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3458","Name":"HXlbaqhgb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3459","Name":"tajDZMywk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3460","Name":"VUSYzvxhn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3461","Name":"VFVbvXedu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3462","Name":"EOJYVLUun"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3463","Name":"YfBMkjeJW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3464","Name":"SrpnYfWeW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3465","Name":"IencuTjAT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3466","Name":"KTSFmVpVZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3467","Name":"OMzJAcUsZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3468","Name":"lRsrGETcz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3469","Name":"sqokNMOtR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3470","Name":"OffzlZLXk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3471","Name":"XUfTJpnYh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3472","Name":"CiNVVYPdu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3473","Name":"sOXoWzLNU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3474","Name":"sTouYJajT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3475","Name":"RqWlxfPNs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3476","Name":"QjLCEyndK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3477","Name":"DextDQSne"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3478","Name":"VlDCnjZZj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3479","Name":"QXPuwJGWn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3480","Name":"ZxSFHGHHO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3481","Name":"AqiKuXsWl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3482","Name":"ZxMYwzZqD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3483","Name":"KypULbxRs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3484","Name":"jzSjPriAC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3485","Name":"YDYBaqVIN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3486","Name":"LYXCHFlSW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3487","Name":"hPHZkGccQ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3488","Name":"yjdBafDOi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3489","Name":"VRHXgFHfX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3490","Name":"AHPgSIKCU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3491","Name":"YcittPDkh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3492","Name":"QKaugOJbJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3493","Name":"XJRsGYPKk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3494","Name":"MpoHZpDrT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3495","Name":"ZNseHvyfI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3496","Name":"uMkAlXJAD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3497","Name":"zmDRjDwAG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3498","Name":"TJBWjcLIx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3499","Name":"wOuAvRgMI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3500","Name":"ismOsIKMk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3501","Name":"zrmnjGhYQ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3502","Name":"umnTSRiqI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3503","Name":"pkIEiPken"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3504","Name":"xPHNWmQHA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3505","Name":"qePPeuqTE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3506","Name":"zdWDqjVKT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3507","Name":"LWmZEBVBU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3508","Name":"aumbycsGy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3509","Name":"nGSigOBOO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3510","Name":"qqhtXMFxv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3511","Name":"sSYDclQVe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3512","Name":"LgPmNwwct"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3513","Name":"VmwXsCihE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3514","Name":"OGWhABYkB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3515","Name":"CCqtWddIb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3516","Name":"xoWjwSJNi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3517","Name":"YAwzaUhhJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3518","Name":"gjwIhlgiV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3519","Name":"YqsJOqOLc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3520","Name":"KHJGtBvQv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3521","Name":"GKwIVJaUU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3522","Name":"ccImvsmYr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3523","Name":"dGblxLJNq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3524","Name":"XukipgOvD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3525","Name":"ELLuMqQns"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3526","Name":"DkPTKczED"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3527","Name":"OFXBLxpXo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3528","Name":"nchqkvLVV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3529","Name":"sFaxlLmtX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3530","Name":"APoIFxNss"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3531","Name":"alaRutdYl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3532","Name":"uGqBrDeYU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3533","Name":"TdIpwWxOH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3534","Name":"TmvaJKysq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3535","Name":"hrBZaSsvr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3536","Name":"bpAaFEtPA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3537","Name":"qsvqakXxu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3538","Name":"jGhhVVIXk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3539","Name":"eKzpmbzzR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3540","Name":"JUvrDxUgE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3541","Name":"nshDdwVVr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3542","Name":"oRWrMCfQS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3543","Name":"nedSmdvRO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3544","Name":"NNhyGyaZO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3545","Name":"LbkjutGIB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3546","Name":"pPWtiTyca"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3547","Name":"jOcGjAFLc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3548","Name":"ZljSFZNXK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3549","Name":"zQvypoFXm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3550","Name":"AqvcScbFm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3551","Name":"vLBIuaXjG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3552","Name":"UISjRNlAs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3553","Name":"wnPBRqgFo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3554","Name":"lgKFmyWOq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3555","Name":"QjwecoUVz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3556","Name":"uoTqFcltt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3557","Name":"LLsTYtmfk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3558","Name":"xAxolMFIq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3559","Name":"OAbxbYzEk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3560","Name":"vcCNhLnXq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3561","Name":"zCZjVDSwF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3562","Name":"RbQVANxgd"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3563","Name":"SQRIWRkrr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3564","Name":"JbzzDqaNO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3565","Name":"RkQjtUmOp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3566","Name":"CYJNXSzeD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3567","Name":"YGRKnhEzZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3568","Name":"MsWtkeoPP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3569","Name":"pcQawlMku"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3570","Name":"uAuZgnFIx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3571","Name":"ymwoXkRBF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3572","Name":"INkXWNXFK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3573","Name":"GHzxGihfD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3574","Name":"dYzSrpmVP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3575","Name":"HejjeAPyf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3576","Name":"rQVmVRaWe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3577","Name":"XHUzyPczm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3578","Name":"xffpjIfYR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3579","Name":"xTiFLfOhh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3580","Name":"cRGyQEVsD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3581","Name":"PFqsSbvur"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3582","Name":"mtdpIGKPG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3583","Name":"vVRAovAKc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3584","Name":"hMYKRKxQg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3585","Name":"UFZfXWqBm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3586","Name":"FOrjNyUbD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3587","Name":"IALhOHzpu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3588","Name":"rMEnzaVhh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3589","Name":"TftqdzHzK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3590","Name":"MLQMStUDY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3591","Name":"fmLZkxsfW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3592","Name":"qJqsPaZuz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3593","Name":"hBlKwmiRH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3594","Name":"WqbIoRJHz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3595","Name":"VrjSuNKUx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3596","Name":"rQwLyXPPH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3597","Name":"PUOPFPctR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3598","Name":"foxbkcrEL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3599","Name":"ZrfxuVXky"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3600","Name":"gdXubEjoj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3601","Name":"tqTDWiRzk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3602","Name":"ODayLuPQE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3603","Name":"SbwDQdxIr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3604","Name":"gpnGoJbOA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3605","Name":"zKGzaJBLP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3606","Name":"SqBphqjow"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3607","Name":"XNldUnkgg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3608","Name":"BHFsjMpYb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3609","Name":"aZSwnYezh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3610","Name":"BpPEPnjnb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3611","Name":"COiyuzXeE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3612","Name":"fPkoTKHrI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3613","Name":"iFyiuiwow"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3614","Name":"ioglUSYJO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3615","Name":"qOTmLVcKK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3616","Name":"VRXAiLZAK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3617","Name":"kytwcIGeR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3618","Name":"vPNatyPqq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3619","Name":"pQmwzzTZF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3620","Name":"IKGesLpet"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3621","Name":"ZXmijDtkP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3622","Name":"PpULeFGjV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3623","Name":"ThCiRRAXu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3624","Name":"cAqVNguEF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3625","Name":"xqfmMCHOQ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3626","Name":"TKjgpORWm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3627","Name":"kqjownTFM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3628","Name":"phUJiSsre"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3629","Name":"eKPRUoUar"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3630","Name":"qvYlbrzzI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3631","Name":"FmIMilyZi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3632","Name":"BhgvBbMDK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3633","Name":"spMImOPuS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3634","Name":"KYuNcHljC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3635","Name":"hCRXolVlI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3636","Name":"qEapGPkrT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3637","Name":"UDszqEtkr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3638","Name":"WrEtPyHCF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3639","Name":"RGZHfbGOb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3640","Name":"QrnQFrzeg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3641","Name":"kaRjizGEo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3642","Name":"tHfRUgqpt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3643","Name":"SJljBAdvC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3644","Name":"iPvWDUBlV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3645","Name":"MWEmknFAu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3646","Name":"OPAuTXUtB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3647","Name":"pQXzbkDAm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3648","Name":"rPQHduqyB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3649","Name":"JMKjeaMec"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3650","Name":"njxLIKehp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3651","Name":"SVPVFFcJX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3652","Name":"fudDKEVZY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3653","Name":"uaGAQpcHu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3654","Name":"eWSMNBvNI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3655","Name":"HJkXqhQEU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3656","Name":"UegtTfNiY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3657","Name":"oXEitbNyY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3658","Name":"RiDFiKwpr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3659","Name":"EkevVFZuW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3660","Name":"LSIJxIQdD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3661","Name":"UvfScPCrk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3662","Name":"ktAEGdYNw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3663","Name":"HTDWZXiws"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3664","Name":"NvmRWQmfE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3665","Name":"yGKnMVxTJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3666","Name":"zeCLirtHz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3667","Name":"wYSCeYOwJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3668","Name":"iknAThqvx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3669","Name":"hVPRVzvmu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3670","Name":"pLeYsGcRr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3671","Name":"EuUVJLjOd"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3672","Name":"mnNoAdeHt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3673","Name":"asRHHzLvM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3674","Name":"CswxCOdWg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3675","Name":"tnjIsJAPy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3676","Name":"OxyumMyow"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3677","Name":"ViFTCGYlW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3678","Name":"STCrjqTex"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3679","Name":"qrEFsxatz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3680","Name":"lOuLweDjG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3681","Name":"aJIrBVPnc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3682","Name":"hfuqYQAsB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3683","Name":"BQaKCgRQS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3684","Name":"WTZWnBGCz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3685","Name":"hXNIHlUdi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3686","Name":"yBGJKLshE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3687","Name":"OHcyPlidb"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3688","Name":"ERFOGYVgi"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3689","Name":"KFbKvGPVu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3690","Name":"oEGzpIlmo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3691","Name":"oVLcnumrq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3692","Name":"kXSphJcaC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3693","Name":"EcXVNsDri"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3694","Name":"cpBfxhYJX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3695","Name":"UEyasBRsJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3696","Name":"DLxLuNOTe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3697","Name":"TFegLpVaK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3698","Name":"xpSTbLxeO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3699","Name":"aMZuibYEP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3700","Name":"uLumBVCWr"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3701","Name":"NEUmNNkUs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3702","Name":"trefyzGgC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3703","Name":"zkwoADEsZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3704","Name":"DoOtcIMJR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3705","Name":"BbyGdrAvB"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3706","Name":"wVidndeSE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3707","Name":"flpXSZyuy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3708","Name":"MktQyfKCm"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3709","Name":"oydXeTUbz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3710","Name":"bdZFNTOAC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3711","Name":"RbPngubjO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3712","Name":"ngvrQiqeO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3713","Name":"nffMPXtWK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3714","Name":"OlmiDutar"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3715","Name":"oyLJfEYKs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3716","Name":"bRfuKwLhL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3717","Name":"WZtOxVffA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3718","Name":"iEZLuZKPW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3719","Name":"RNYGZKYox"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3720","Name":"sZfgBKpFg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3721","Name":"RcHCQpnco"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3722","Name":"acDzEeVOl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3723","Name":"jbRRvLfRY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3724","Name":"VVZMbLZvK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3725","Name":"HEqNfkexF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3726","Name":"hTOVxAYje"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3727","Name":"YkBelFYFD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3728","Name":"AjRyFxrMW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3729","Name":"atJbVdpZD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3730","Name":"GCFlaUaRo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3731","Name":"hmwEaCJjJ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3732","Name":"LCXpoZebL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3733","Name":"rlmWyfyLo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3734","Name":"dzqMxYCki"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3735","Name":"NkeOoNUTo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3736","Name":"WmdhUyNVp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3737","Name":"tbUvlOcyX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3738","Name":"SaMTfkodo"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3739","Name":"VcpPLtUzO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3740","Name":"ljIvJGbir"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3741","Name":"xpeENkEbg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3742","Name":"bXmcadghT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3743","Name":"uhCKUBWDt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3744","Name":"kIJznYbvh"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3745","Name":"KUBTEaPlt"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3746","Name":"DISNqMfMg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3747","Name":"SoufQEQIP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3748","Name":"CAuVkYdTT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3749","Name":"XvcDcDQbS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3750","Name":"cbqODRZhD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3751","Name":"ZTmlgrAxv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3752","Name":"fuCLaeHqu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3753","Name":"OruVrjrnc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3754","Name":"vpDIYFNug"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3755","Name":"NwADGNKKO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3756","Name":"kffKebfGa"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3757","Name":"CeXvspkmX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3758","Name":"xnzkBcvoS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3759","Name":"HlmhSejbz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3760","Name":"UOkRaFaqG"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3761","Name":"XdDtoWNqT"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3762","Name":"tdlIJFbXu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3763","Name":"GYSxCsKcD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3764","Name":"WstPjONVy"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3765","Name":"wBbgyhDvO"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3766","Name":"WyuMaIgxn"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3767","Name":"sIhjSBdVM"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3768","Name":"xvAYPpqbu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3769","Name":"BWKccBjdC"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3770","Name":"oUXgmyVgF"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3771","Name":"ydFSibSEA"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3772","Name":"TfytszxwP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3773","Name":"ZwGpFTWAS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3774","Name":"oyylXHIrH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3775","Name":"tJHponFcU"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3776","Name":"uOJuomvIV"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3777","Name":"MoaurQeGs"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3778","Name":"QoDknqvlS"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3779","Name":"EpYPUwrLw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3780","Name":"EEkhDGmPL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3781","Name":"rUfVElWoI"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3782","Name":"kignttMxE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3783","Name":"uaWIrXqVc"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3784","Name":"eYEJTFFwj"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3785","Name":"UBSsvMKko"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3786","Name":"EgRlkZKwR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3787","Name":"WwDjuWmRP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3788","Name":"KkxqHKIBu"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3789","Name":"KoLtSIVCD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3790","Name":"GvXCrTqvz"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3791","Name":"osuePREmY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3792","Name":"BECPuAdxx"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3793","Name":"uSETwspAe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3794","Name":"auOSuNELN"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3795","Name":"ZgwlfduAL"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3796","Name":"dXBXOciot"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3797","Name":"WnsQgKQZR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3798","Name":"RQVMofWTl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3799","Name":"YkJhKvMxk"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3800","Name":"TkSSovDgR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3801","Name":"qFoQJxAZv"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3802","Name":"wsVTlROKY"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3803","Name":"EfTqqVuHl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3804","Name":"djKmfZNAD"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3805","Name":"qMZdpYwfg"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3806","Name":"BqnRvefBw"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3807","Name":"XUeJQZRKf"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3808","Name":"AgNZAxszX"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3809","Name":"nsxNEKsIp"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3810","Name":"VlLGOHWwR"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3811","Name":"RuONcRAiH"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3812","Name":"QeYrZtkXK"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3813","Name":"baEwAQBJl"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3814","Name":"cBNebGWLW"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3815","Name":"dhQzbnFLP"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3816","Name":"XDnKZTtwZ"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3817","Name":"QmEmBVyNe"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3818","Name":"vlqyTaBwq"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3819","Name":"bvVyudSrE"},"emitted_at":1673989573000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3820","Name":"eDfBbzPsT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3821","Name":"KoWlYSCdJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3822","Name":"OAJRuRvth"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3823","Name":"jLXxlqFKy"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3824","Name":"TLoUZwGcM"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3825","Name":"VlGEAhIhw"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3826","Name":"YiqiuJBbR"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3827","Name":"zNIELkCAP"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3828","Name":"cIVznvTJk"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3829","Name":"CyjuwQVtn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3830","Name":"FpHBCquSs"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3831","Name":"pttrNOGZD"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3832","Name":"kmKWOsQfT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3833","Name":"IqmYmInSh"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3834","Name":"TZNZAgPSt"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3835","Name":"IIozlYzdG"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3836","Name":"TAGPPoLXV"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3837","Name":"amIeTzzvH"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3838","Name":"YUNfDDIjo"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3839","Name":"zdzxUnlOX"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3840","Name":"hgLKakmaU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3841","Name":"DRFArHFay"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3842","Name":"tGtwPGSjn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3843","Name":"vtxpzWimW"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3844","Name":"Enpkbnsgc"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3845","Name":"iVYNvVnDD"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3846","Name":"BQCbUZSFC"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3847","Name":"QJliMSFKR"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3848","Name":"ZTgAYYUfR"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3849","Name":"ROEZijaRa"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3850","Name":"LeQjGSADK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3851","Name":"eBykRZdii"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3852","Name":"eEHYHoJiK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3853","Name":"ukrmZIZDl"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3854","Name":"BSeJiRsIb"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3855","Name":"fCUCpmZQK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3856","Name":"dMWkLwpVu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3857","Name":"aYFJhhocq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3858","Name":"wesZYgEkf"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3859","Name":"BvnsBSNom"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3860","Name":"RmNDBkyWt"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3861","Name":"dFkkDvOdd"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3862","Name":"fnFWTEyhb"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3863","Name":"DpxCrDWhf"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3864","Name":"ViRLLQGCg"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3865","Name":"fUNsLmFQK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3866","Name":"pisZJdkYh"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3867","Name":"aBxzfMtbf"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3868","Name":"UvFzOOKbk"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3869","Name":"RNlOMXvfP"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3870","Name":"xfpgkLnkq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3871","Name":"TexNFXFRq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3872","Name":"yRAWjgYOU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3873","Name":"MFvKZYmir"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3874","Name":"dKvUQBfxV"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3875","Name":"reoJLbsQp"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3876","Name":"dWGPvmPUz"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3877","Name":"WaMdxolTU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3878","Name":"OMTfmhfoc"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3879","Name":"EMXbiZZKt"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3880","Name":"mRULPqvPp"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3881","Name":"KtehGrXUv"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3882","Name":"ZVgzlzZcZ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3883","Name":"rKCpPleOU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3884","Name":"mjKqGXjhA"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3885","Name":"HmVDtrpXn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3886","Name":"jLDPlnMyb"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3887","Name":"YKicFJImf"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3888","Name":"lAIilqrph"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3889","Name":"QZSalREvh"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3890","Name":"yNBlIeBVK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3891","Name":"WrCknQQwI"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3892","Name":"cmMhYpqzD"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3893","Name":"RhNogzCps"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3894","Name":"xYNnKSPJs"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3895","Name":"rqBXzpPsu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3896","Name":"zAkkNFZef"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3897","Name":"FRcbzphLQ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3898","Name":"YtSyAFJGA"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3899","Name":"qSSWpzaXF"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3900","Name":"lwHPYhrGa"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3901","Name":"bFjdBHNId"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3902","Name":"CRzONghSX"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3903","Name":"yfyXFTVua"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3904","Name":"UOrTdngef"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3905","Name":"dUVLkyuFo"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3906","Name":"PYkRGrwmo"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3907","Name":"TheoxksWd"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3908","Name":"zYrycZsrT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3909","Name":"bbImlZtux"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3910","Name":"HvvXNqMQP"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3911","Name":"skJHRFNJJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3912","Name":"DxDpXihuM"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3913","Name":"cKcExzyIT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3914","Name":"vAhmpdGwk"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3915","Name":"YWnvMdoPp"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3916","Name":"XbjPBMXgw"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3917","Name":"PWsUsCTYs"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3918","Name":"urkRwRtvp"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3919","Name":"vScibLboI"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3920","Name":"xHyZCzmfD"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3921","Name":"JQXntyaaN"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3922","Name":"hGqcQKmEz"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3923","Name":"YzTgZLhhL"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3924","Name":"DUcVYdBsu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3925","Name":"gnhwIksEK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3926","Name":"EHefAlrbO"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3927","Name":"ticEXSEbH"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3928","Name":"fhGASYvRv"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3929","Name":"aYhYcGnjT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3930","Name":"bkswKRZAm"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3931","Name":"yyjxitUMU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3932","Name":"keFDxeEHK"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3933","Name":"KHXWxGKuq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3934","Name":"NQagChCBW"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3935","Name":"ziroEwDfd"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3936","Name":"ixpZwAJax"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3937","Name":"rXetPCQrE"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3938","Name":"zlkJWefzJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3939","Name":"twKNaxxar"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3940","Name":"gHyklvqeo"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3941","Name":"bMmDHkVNU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3942","Name":"zpKmoSAgg"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3943","Name":"EusolaiRq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3944","Name":"TOFSAUYLu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3945","Name":"tIagTolkC"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3946","Name":"EIFYSrwFw"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3947","Name":"jpsFpQBcf"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3948","Name":"hhwxXiFqn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3949","Name":"YjTCJJASY"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3950","Name":"NGRSBBqDc"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3951","Name":"blCNHFzns"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3952","Name":"cqscSSvvq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3953","Name":"uNhesLMKT"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3954","Name":"OpHxnIzrn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3955","Name":"hpyoGkfME"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3956","Name":"PdafhNPZE"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3957","Name":"ZyHwyCQBe"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3958","Name":"AjRoBiZoo"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3959","Name":"gbgGXCqFJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3960","Name":"QGXYXbHNR"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3961","Name":"SDuHyuzop"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3962","Name":"eGBLxSfPs"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3963","Name":"zPnXXdyVH"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3964","Name":"CunAKNAUj"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3965","Name":"PyjBNaAhq"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3966","Name":"eYeporPpg"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3967","Name":"sSyVHmTpm"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3968","Name":"AgCPvxbfn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3969","Name":"sfOXIsOjO"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3970","Name":"OuINzRxAw"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3971","Name":"fVnFlpsAU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3972","Name":"cXMYOxaFH"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3973","Name":"MBdptiIlJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3974","Name":"KaocUXuPU"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3975","Name":"cLZeXAzQi"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3976","Name":"nlAFUwBsb"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3977","Name":"PsvHEBmif"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3978","Name":"FaekDYzhF"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3979","Name":"xlKzjrEsX"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3980","Name":"WfnditrQg"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3981","Name":"fXgeBwnTS"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3982","Name":"amokpzePZ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3983","Name":"wDMCHsMaB"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3984","Name":"FLUoWoRSm"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3985","Name":"LEmOVuKjs"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3986","Name":"vcwYXhwMv"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3987","Name":"HLsWoZZvl"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3988","Name":"HDsxwTugZ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3989","Name":"lkNDCyQQJ"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3990","Name":"OIDOMGNsu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3991","Name":"CQZUIMfOn"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3992","Name":"hEkVBhndb"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3993","Name":"rbNGrlwky"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3994","Name":"oWSveIqcI"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3995","Name":"ULVimudJG"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3996","Name":"xhdaKkMYu"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3997","Name":"vFIwExoYB"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3998","Name":"LtLwrtYhz"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"3999","Name":"fwTlEoxlp"},"emitted_at":1673989574000} -{"stream":"Sheet6-4000-rows","data":{"ID":"4000","Name":"rmvTIlmYQ"},"emitted_at":1673989574000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1","Name":"HKOYohtoy"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"2","Name":"JihPBqabq"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"3","Name":"YjYEEtsLL"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"4","Name":"QRKtxKNHe"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"5","Name":"tDqEgpjwL"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"6","Name":"GMlYPSytk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"7","Name":"hSVKuWlkD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"8","Name":"YlMLYUOKc"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"9","Name":"OOxRfvJAo"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"10","Name":"luVGPHYdn"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"11","Name":"vUbvQMGoJ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"12","Name":"JiJSiqUKv"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"13","Name":"MdrigkEkt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"14","Name":"AMEmlFqER"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"15","Name":"RrFAiQYUf"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"16","Name":"zJtQRvMiu"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"17","Name":"MgeqSGwtm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"18","Name":"rzxHSNLux"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"19","Name":"WxXpvXKje"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"20","Name":"VayzeSoOG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"21","Name":"shNMKJSFk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"22","Name":"IoXbkhjgb"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"23","Name":"ciVIRhGKE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"24","Name":"BYnlmflXd"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"25","Name":"QVBwnHxsk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"26","Name":"OYEHrZzFg"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"27","Name":"OKiIWkcWj"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"28","Name":"tssxsiFSB"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"29","Name":"cAqTbDugy"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"30","Name":"vwOHAaGUS"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"31","Name":"yLJTYmwPG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"32","Name":"PdnatTOcC"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"33","Name":"JitiDwXLK"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"34","Name":"wfgvOxWqE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"35","Name":"MbgKHaSZn"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"36","Name":"NPZUaAjmd"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"37","Name":"xCawJPKkL"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"38","Name":"gLLCIOAFG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"39","Name":"axDrOVmhq"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"40","Name":"SMBhktbfO"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"41","Name":"HajpaJYIH"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"42","Name":"MYVrEjFwJ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"43","Name":"NOaXaLnVH"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"44","Name":"qJGAsykEJ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"45","Name":"XVuaIakAH"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"46","Name":"ZicCntsxl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"47","Name":"HwLMPpJFr"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"48","Name":"EXCEvEsLi"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"49","Name":"ebhjldgcw"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"50","Name":"jAhvsbWfj"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"51","Name":"vfxRHAVkv"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"52","Name":"LlDRgmdiT"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"53","Name":"kkFKKqUBF"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"54","Name":"szetlOliM"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"55","Name":"MqSGUVyql"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"56","Name":"TtiKoaiXS"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"57","Name":"dOhpxZIBX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"58","Name":"ctNLZziAo"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"59","Name":"PuhmFaNCC"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"60","Name":"zguEkPvBU"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"61","Name":"VYaVyHsXm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"62","Name":"uMDveQluH"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"63","Name":"izjzfIaGT"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"64","Name":"wdwwSLEZG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"65","Name":"NdGicRlpP"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"66","Name":"RajkplGtT"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"67","Name":"VWdqzbjnZ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"68","Name":"rQrafxMdQ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"69","Name":"ZKVDSBOgj"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"70","Name":"HiKoloWcd"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"71","Name":"ALLfFoYPe"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"72","Name":"JSntTjGnA"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"73","Name":"vqChVrQJE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"74","Name":"HRztSHIPb"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"75","Name":"fVtUjdgfw"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"76","Name":"KACCbqcMk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"77","Name":"vNMalGlEk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"78","Name":"pbKBeeJDk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"79","Name":"tjjuCnxTL"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"80","Name":"DmblYorPx"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"81","Name":"jGZifaptY"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"82","Name":"wNAWPZxoo"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"83","Name":"DgcmJfLsw"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"84","Name":"mCpIoKNKZ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"85","Name":"bxHduXTnh"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"86","Name":"akTvwTNVs"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"87","Name":"UiEKKTWII"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"88","Name":"nCcsMIbrP"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"89","Name":"CbRHYaOVe"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"90","Name":"wqunudifE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"91","Name":"HQnkdqILK"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"92","Name":"BZvVDmBTe"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"93","Name":"HoTywmlnm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"94","Name":"YAOCdAFJB"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"95","Name":"StQsiYOwK"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"96","Name":"LkLbdTviV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"97","Name":"dumzUMEzs"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"98","Name":"SzaoCCpUa"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"99","Name":"DTYQLMcyo"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"100","Name":"XxSDqMYIV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"101","Name":"BTtvdXYjK"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"102","Name":"UzTjvfUyj"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"103","Name":"ZYPAHbHOs"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"104","Name":"TctfQHhZW"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"105","Name":"idClfQSuq"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"106","Name":"psRmjVUBl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"107","Name":"JmDVZFLbm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"108","Name":"hLeJTYGEh"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"109","Name":"DujuNeBMN"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"110","Name":"MfrTsXCeE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"111","Name":"SxRpjXXJV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"112","Name":"byEvGfeqh"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"113","Name":"lCGKFHUMV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"114","Name":"WomwRnEnG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"115","Name":"jBXYkjydD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"116","Name":"aLjlzoSRn"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"117","Name":"WGZpHbppn"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"118","Name":"EvOumyHSn"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"119","Name":"VvRPwCfkG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"120","Name":"MEMGPIPLm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"121","Name":"yayAbistG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"122","Name":"SXpIRBPEt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"123","Name":"ZsECkwZQU"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"124","Name":"FfHtePhxu"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"125","Name":"XAJLZeSEX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"126","Name":"VAhvkZoBD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"127","Name":"LNSKZOvTd"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"128","Name":"MZENkhJbA"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"129","Name":"RssQutiIr"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"130","Name":"NAmqJxXzV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"131","Name":"VyZhbDgmm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"132","Name":"VIAGxKJAc"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"133","Name":"xLwWBPafq"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"134","Name":"OAdsGGrWu"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"135","Name":"NHbBfNmNY"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"136","Name":"FpYmmMCds"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"137","Name":"MBNcBNkOm"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"138","Name":"mZNfRuQqA"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"139","Name":"IFMOQtGvT"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"140","Name":"oGfDTOtcD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"141","Name":"iQhNQQSCt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"142","Name":"TVOKVBMiW"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"143","Name":"ztKnIyqkb"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"144","Name":"WkKeqmkRW"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"145","Name":"yZmAWvlAF"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"146","Name":"YtPtRAjcl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"147","Name":"xbMpOYzmM"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"148","Name":"KbiRNYIUq"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"149","Name":"SyMaBAcqP"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"150","Name":"ntJRYHYYf"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"151","Name":"sDbHtkpky"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"152","Name":"boWFTZwbW"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"153","Name":"PQlJAZiBl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"154","Name":"AWfLUJSKv"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"155","Name":"ESOrNWtDG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"156","Name":"YabNZLklp"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"157","Name":"umeoHMJop"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"158","Name":"QpPWXrLMD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"159","Name":"jPqcnnzDD"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"160","Name":"rrqjeFIif"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"161","Name":"nBdfwZCIy"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"162","Name":"ShaYHXaHO"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"163","Name":"hdHTHpFvi"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"164","Name":"BKMPANWbA"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"165","Name":"WpmvKMrVt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"166","Name":"fHuRkdsKt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"167","Name":"ZCOqWurcE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"168","Name":"wBBnwaREX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"169","Name":"LBMZhpQDK"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"170","Name":"oBkkzbKBM"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"171","Name":"ZUDHkoqhk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"172","Name":"HJKFXofTE"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"173","Name":"MrbOWRJVZ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"174","Name":"eJESUxMkg"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"175","Name":"fXxfcZAVd"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"176","Name":"TXKKvLDuy"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"177","Name":"ESfgSDoEj"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"178","Name":"VVVWgRqkW"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"179","Name":"ijsAHEZTk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"180","Name":"WpoqeBSDo"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"181","Name":"xZNgSHVZt"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"182","Name":"IaeSdRGIX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"183","Name":"RaKyMUsxZ"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"184","Name":"byJUNsAXO"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"185","Name":"JWstJraRx"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"186","Name":"VkBVcPNDf"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"187","Name":"LodIrsRkg"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"188","Name":"IiwdqKeYk"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"189","Name":"JjquTEFEU"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"190","Name":"iBsbkOTIR"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"191","Name":"rhonaHtoX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"192","Name":"MPFvRWwHl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"193","Name":"XcjrRANZl"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"194","Name":"GCglqARDI"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"195","Name":"OxkTkIAnV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"196","Name":"OclfysquS"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"197","Name":"skzCKYUgY"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"198","Name":"EAUvKCGHR"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"199","Name":"ByyqjnbPB"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"200","Name":"cYZiSZIrO"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"201","Name":"ofUUsfZyx"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"202","Name":"lcYHmFMhV"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"203","Name":"wJOEfNdXX"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"204","Name":"sTytgGDEb"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"205","Name":"wNCrySgoi"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"206","Name":"nlhuvWuQG"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"207","Name":"rlPwuVnpN"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"208","Name":"iiYjVxacA"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"209","Name":"BwxIbRMdr"},"emitted_at":1673989567000} +{"stream":"Sheet6-2000-rows","data":{"ID":"210","Name":"RORMzlwJE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"211","Name":"KzsZhjaJa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"212","Name":"NlPWoTJmu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"213","Name":"ZCeGBASxO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"214","Name":"woNEKMcIu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"215","Name":"rmTGDMfrs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"216","Name":"cFEenHOsx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"217","Name":"NqpuPTKKm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"218","Name":"ExRVTviEg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"219","Name":"GsDxKNIgm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"220","Name":"dLivYHQiC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"221","Name":"gqJEwdpVb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"222","Name":"CsGWPAsDK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"223","Name":"MyooWzeER"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"224","Name":"MBpwxPGUN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"225","Name":"MlKbPgJVC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"226","Name":"OrjMKpeFJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"227","Name":"hwcVeaBGP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"228","Name":"ZlrwSMXYh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"229","Name":"emmcHtCqq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"230","Name":"DhLJwRjID"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"231","Name":"VQXYYKsci"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"232","Name":"qaxpQbyJx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"233","Name":"cEXmTcgkE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"234","Name":"TQqXukneS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"235","Name":"msTLYqVDG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"236","Name":"pHcYGTLrC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"237","Name":"VXjGBwQIF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"238","Name":"zqqVIgZmy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"239","Name":"FSrJGxVWD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"240","Name":"YeDrbzaGC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"241","Name":"zwtUTcMyq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"242","Name":"ioxTUTxrf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"243","Name":"WfWSfCkmP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"244","Name":"SNSgzxzXg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"245","Name":"laVCTkACS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"246","Name":"wfSFulPQl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"247","Name":"MsYNFWlaz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"248","Name":"VVzdpqXgY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"249","Name":"GHSlPRtLM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"250","Name":"LYiRGrkrz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"251","Name":"QklBlVoyQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"252","Name":"hyMTVHbuT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"253","Name":"YFwOmpLoZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"254","Name":"qVJLPdcxn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"255","Name":"XLkkMlnXp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"256","Name":"QkvcbmBgJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"257","Name":"FiixlYrIv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"258","Name":"ZWmsdohhg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"259","Name":"MYfvWudav"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"260","Name":"tKZtsXPIx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"261","Name":"ZarREiATF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"262","Name":"jDKpKSCZG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"263","Name":"INVnRqeZQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"264","Name":"vHmpbLLBt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"265","Name":"aPlRHtmmp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"266","Name":"phcnyBpJs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"267","Name":"ppjzwpVmz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"268","Name":"jMqzCwoSq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"269","Name":"PBDqthrYx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"270","Name":"gfeYcZXhb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"271","Name":"urZOuPrfW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"272","Name":"yhpITYLgv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"273","Name":"LPLtApRLN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"274","Name":"sXtnIFxJH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"275","Name":"bUMGorrKO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"276","Name":"lcDeVjbMr"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"277","Name":"pwUKeXzyt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"278","Name":"QLBnLJKhc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"279","Name":"eTJtnXFez"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"280","Name":"gXCVGkMfW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"281","Name":"JpmHpfYOL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"282","Name":"OEzPvvyYn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"283","Name":"BxhOlZjsc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"284","Name":"CMwZNQokF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"285","Name":"VzhxSKSgc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"286","Name":"HDEDArrcV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"287","Name":"oLKyKtZxD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"288","Name":"lquLSGnjh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"289","Name":"CycNjOUYF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"290","Name":"AzuVbTuyd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"291","Name":"cUNvTQyPJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"292","Name":"rUGFDFGSe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"293","Name":"NhrjSBjDx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"294","Name":"xYatsZOiy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"295","Name":"LtnWeamBh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"296","Name":"DRFxVOUEM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"297","Name":"WlDPjNmSV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"298","Name":"UQPVwpmAP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"299","Name":"pZfHsWhcp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"300","Name":"lfypxATlf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"301","Name":"yzQLniaXM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"302","Name":"yzkYrMZfE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"303","Name":"jdQQfPocO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"304","Name":"YPyrDClLz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"305","Name":"zhxGHFTve"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"306","Name":"ychyaNMtp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"307","Name":"XhpsfGgpF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"308","Name":"lolbURYcW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"309","Name":"IfbRGrrQZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"310","Name":"mehfuZacw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"311","Name":"BlqFvJQHW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"312","Name":"ZYTrVZYuf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"313","Name":"cjRazTbFZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"314","Name":"GaVgqAqfJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"315","Name":"CyEmWFnww"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"316","Name":"mkxaZJeZc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"317","Name":"PjhmnGPtm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"318","Name":"kWwiKohgf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"319","Name":"NNbxUfISc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"320","Name":"nKGABysXI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"321","Name":"dPjFlZZph"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"322","Name":"pRAFKBoJd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"323","Name":"cYitflbQC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"324","Name":"vUTRaXOoM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"325","Name":"OqRoYPDhl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"326","Name":"VpqzAaLtD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"327","Name":"PnZepjSUd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"328","Name":"DUrGcxNVo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"329","Name":"NBQtCdTSj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"330","Name":"cWCjPNzpQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"331","Name":"lHIXIadUs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"332","Name":"oqpCeRKVx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"333","Name":"ctBSuXWyn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"334","Name":"tYpcsHixA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"335","Name":"VcBhHdqzQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"336","Name":"fAwCtjECq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"337","Name":"vfFMyzUwU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"338","Name":"UTrmoEfAG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"339","Name":"NIuNNEGgl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"340","Name":"QfVEDUddB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"341","Name":"WrGjEptQd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"342","Name":"WOsMVQcrE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"343","Name":"myPkSbUAt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"344","Name":"mLlCSDRvd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"345","Name":"tLkkxQECm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"346","Name":"LKKVdStiP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"347","Name":"jUlspaMCf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"348","Name":"hteUZjGYG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"349","Name":"JKqhqBveO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"350","Name":"rjEiNZfvv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"351","Name":"bQBHfyAoh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"352","Name":"oOmYiqxOL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"353","Name":"ubFqSuHyK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"354","Name":"gLRZWccdO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"355","Name":"BFhkfPOBB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"356","Name":"dZnIsdmSC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"357","Name":"eBUyEYidA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"358","Name":"QawwEZFue"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"359","Name":"SNhQeRZtE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"360","Name":"cXXeXTwIR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"361","Name":"VqeYGWhHj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"362","Name":"PRNmOTFQT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"363","Name":"ouksKBUoo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"364","Name":"AVHyzoidp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"365","Name":"mtBKNuLDw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"366","Name":"XgfwBAFIT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"367","Name":"nZObsdLqA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"368","Name":"ueNTtibEM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"369","Name":"SOdbXjaBt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"370","Name":"SKmlaGriU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"371","Name":"CwWvXhgHm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"372","Name":"hAfPCxrMa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"373","Name":"NvFKEuExd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"374","Name":"WUpPLDrDu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"375","Name":"nxzniiRrI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"376","Name":"mxFhwxWEs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"377","Name":"uEVWhhjhx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"378","Name":"LRBoIyotF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"379","Name":"eRfyYlCXN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"380","Name":"oWsGQSpyy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"381","Name":"gDFEggyEB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"382","Name":"iAlcMymyk"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"383","Name":"HfUoRYPql"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"384","Name":"UDEzylwrU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"385","Name":"aZyaROHnX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"386","Name":"PtClOxnYE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"387","Name":"zUKzFZaGB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"388","Name":"pxPzcUrir"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"389","Name":"lFxTnCqhv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"390","Name":"kAxkEhgUB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"391","Name":"sXGvDmBtN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"392","Name":"XJLxibbdc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"393","Name":"pMlrfsitQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"394","Name":"yAHduuWNd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"395","Name":"ktYFLraOw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"396","Name":"apjpDCbwI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"397","Name":"KyvMdUahm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"398","Name":"FWXXEAgoF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"399","Name":"EYDrVTpoX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"400","Name":"Wdwlfsfhb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"401","Name":"UbFlVLNDI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"402","Name":"MfVyIgyHG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"403","Name":"RMuPoEEZX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"404","Name":"HLTsAfIAl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"405","Name":"NvyhHTedB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"406","Name":"GvILrNmWL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"407","Name":"uTcVfaVLS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"408","Name":"BMwZwgYTf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"409","Name":"gOVolsFMR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"410","Name":"FjyTyBMal"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"411","Name":"jBFedJlPd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"412","Name":"XjGJlxYtF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"413","Name":"IUpHWyqHR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"414","Name":"MUezdBDim"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"415","Name":"GSIYCMUkV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"416","Name":"GzYJXbCYd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"417","Name":"axXnhfXDY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"418","Name":"lnDeqUbNN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"419","Name":"ASNdakBlM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"420","Name":"lairvePQh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"421","Name":"fyhwyykDc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"422","Name":"FEsqGnKwP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"423","Name":"PXEWMdFHZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"424","Name":"suyduatoX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"425","Name":"FDjJSUBjB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"426","Name":"OVhokHMJb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"427","Name":"jvTrHMRSr"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"428","Name":"ULZJrjAml"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"429","Name":"AfQFFeoFe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"430","Name":"oKdllGSmF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"431","Name":"qcjfkLUaJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"432","Name":"DgTLilpia"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"433","Name":"EAhZKFFbN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"434","Name":"dyXritsuS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"435","Name":"wtHAoKVVD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"436","Name":"OBAhRtXQg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"437","Name":"VkHMhrVdp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"438","Name":"vdvlaUEHt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"439","Name":"favPZaeUF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"440","Name":"CUhfgzsHK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"441","Name":"XrZTVMTkF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"442","Name":"UuoJWLnWx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"443","Name":"cViYKtoXZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"444","Name":"QRLsshDYB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"445","Name":"egAgcHUCs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"446","Name":"IiznJNLvS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"447","Name":"JPdTIhBXD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"448","Name":"YQPrytaky"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"449","Name":"WTFIrECDH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"450","Name":"GDarIcfiD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"451","Name":"mcfJLwGzC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"452","Name":"MMNRQrYpz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"453","Name":"YjOIWuGIR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"454","Name":"HjKPcbbnX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"455","Name":"ayvtscZPb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"456","Name":"aMdUjeBPK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"457","Name":"pYtsMsNIQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"458","Name":"ZwKDQXTpp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"459","Name":"nFwpcKkUb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"460","Name":"BbmcaTZFY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"461","Name":"WquQFuOYK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"462","Name":"eufnIZTSW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"463","Name":"rYblmHioI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"464","Name":"vzKatFHgp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"465","Name":"yULkpvJqu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"466","Name":"KLZPGjraI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"467","Name":"QIvseYYFK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"468","Name":"GQhaPCOXv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"469","Name":"wLUSgVyzF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"470","Name":"wrrJrvRtu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"471","Name":"xneVfJWre"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"472","Name":"nqsfWKTYu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"473","Name":"qUeCbKFZa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"474","Name":"icYVJmJUa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"475","Name":"PPRmPzhZL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"476","Name":"DzgiubhWv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"477","Name":"WBAKITHSf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"478","Name":"NLfGKrIKg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"479","Name":"KuwnUxoYE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"480","Name":"ichNzxmZV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"481","Name":"NBNFxstsb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"482","Name":"EBYBjBeGX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"483","Name":"IHShetWlt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"484","Name":"NRydquyvW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"485","Name":"MgIozOVzw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"486","Name":"JxNxmdmnn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"487","Name":"CwbPSdAcp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"488","Name":"WOitYWbSe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"489","Name":"TBGWGpHig"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"490","Name":"gNrEhCtYo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"491","Name":"mEgXbuQta"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"492","Name":"FhNaGXDVU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"493","Name":"xRhpLOWAz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"494","Name":"rhsLUpuhw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"495","Name":"ulcDdKbeH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"496","Name":"jNPOwLwZO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"497","Name":"tWqZbbRMX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"498","Name":"ctxUwHsWT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"499","Name":"GkfDDiWKn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"500","Name":"aQUkJHaWI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"501","Name":"gYJBlqwIR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"502","Name":"cjoyuyLdE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"503","Name":"vtFdeRXUP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"504","Name":"mYcbdDSkz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"505","Name":"oULxlkSqF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"506","Name":"RWYzjEvVe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"507","Name":"YEbeWcaVg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"508","Name":"dzhPIyJEM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"509","Name":"QZGfqKnTj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"510","Name":"lCxnXWNUv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"511","Name":"HXdMhzuNU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"512","Name":"lOZKDbwKU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"513","Name":"kEwpTFlDo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"514","Name":"NSfAemXNI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"515","Name":"djkymHTfh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"516","Name":"JilWrRkhK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"517","Name":"SGAocdUyj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"518","Name":"xaDREGdRu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"519","Name":"jJoYHrTRN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"520","Name":"JjpUSfynO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"521","Name":"SuCUlphSh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"522","Name":"ynNPzUJBa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"523","Name":"aYrFExeYA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"524","Name":"pwPNmkpLE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"525","Name":"eqQERmIXb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"526","Name":"PAprjISIQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"527","Name":"YKGfczcPc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"528","Name":"FSyCbwqAW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"529","Name":"uIRXcGSNQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"530","Name":"dQHdUkhCJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"531","Name":"TYlsbwhBN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"532","Name":"gdzOUiYWy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"533","Name":"soENcccUu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"534","Name":"JfmwwXuVL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"535","Name":"odWirIeZd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"536","Name":"tKfngZjGu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"537","Name":"riWiudFqM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"538","Name":"kwlPSWBnE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"539","Name":"xpCSTaKQA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"540","Name":"zQvUSaEVS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"541","Name":"SbHnLdnyN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"542","Name":"idkCmgVkg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"543","Name":"TQhuuMlXn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"544","Name":"EFOkJMlbJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"545","Name":"GSMWnocZC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"546","Name":"BEoLEOonT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"547","Name":"UExABrxKH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"548","Name":"KDEEKahcu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"549","Name":"nHTFxNjdS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"550","Name":"mtkHihxnZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"551","Name":"HEvciDGwv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"552","Name":"vPbchVjSU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"553","Name":"HcUoucRRP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"554","Name":"rtEvjkIkN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"555","Name":"bkLeBAbOb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"556","Name":"XEZuaMMET"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"557","Name":"nSsYzFsCq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"558","Name":"rwsPtfdDu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"559","Name":"jvyhuWRNr"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"560","Name":"ovgfzOVLQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"561","Name":"kavkLzAeR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"562","Name":"bMuGXSpVP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"563","Name":"cWPFIFBGQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"564","Name":"MpyYHHCHd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"565","Name":"SSjAHDKdM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"566","Name":"nvZjyozhj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"567","Name":"hhNNrsxjr"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"568","Name":"ZhCVNPGdU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"569","Name":"NIDwizdJT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"570","Name":"DBVLlhuKH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"571","Name":"QltnqyHVf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"572","Name":"WakCbnssL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"573","Name":"CbmRlAmeX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"574","Name":"uzJfwOozL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"575","Name":"dTeqiBEDL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"576","Name":"QaEaKbOMd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"577","Name":"ZPlVtEyoo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"578","Name":"cCkIDqWjS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"579","Name":"hXPetJMnt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"580","Name":"PMDruxvIe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"581","Name":"msyqrGgsl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"582","Name":"ZsRbYblgV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"583","Name":"GhtigBbhc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"584","Name":"aWGjzQqRK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"585","Name":"xMYNlyLue"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"586","Name":"iaXOnHSaG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"587","Name":"FcDrrVHTI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"588","Name":"gcKWUYjfA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"589","Name":"NMkhOdilo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"590","Name":"yixKusUri"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"591","Name":"GCxRXPucX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"592","Name":"GhPuXkBLP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"593","Name":"XxsgZasQF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"594","Name":"ECkgjIakd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"595","Name":"PmKzzHAbW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"596","Name":"PooFCXSha"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"597","Name":"IAWxmSdph"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"598","Name":"zgNcvsVbc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"599","Name":"ghAKGRsSG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"600","Name":"XfgLrIrgH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"601","Name":"exMKlPilA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"602","Name":"ADBVeCTET"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"603","Name":"oHfUUrJQV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"604","Name":"gyVFtlQNa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"605","Name":"gRNafQqxj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"606","Name":"zmcdDyqMz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"607","Name":"HuyuOgkcx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"608","Name":"lPPyIaBnV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"609","Name":"iPnReofbM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"610","Name":"BjEmICbwd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"611","Name":"qAogkLkLZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"612","Name":"bIeyglwtx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"613","Name":"SQfLCNMOQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"614","Name":"VyvGvFjkp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"615","Name":"flMeymTRL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"616","Name":"omgifpcnm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"617","Name":"FSctjvHzx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"618","Name":"FWFMbWDfM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"619","Name":"upmedQraw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"620","Name":"qsADkxlEm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"621","Name":"bcNMKrBOF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"622","Name":"DckRXLrNx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"623","Name":"TgeUJtewj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"624","Name":"kkytXeMgi"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"625","Name":"kiauowHFy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"626","Name":"WjtHegFIH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"627","Name":"YrFhJvROA"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"628","Name":"CPuvRJusp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"629","Name":"CLfDODMDe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"630","Name":"WXSAPvQkn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"631","Name":"VZiRIPhtv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"632","Name":"uzYxbzBJV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"633","Name":"YbkpJAOhd"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"634","Name":"SjAngTuAX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"635","Name":"zvpAWpzCI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"636","Name":"AySIqrhLM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"637","Name":"BukcEdCjG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"638","Name":"UtZbeozSg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"639","Name":"GzYTRUzbI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"640","Name":"wtKVOwmUQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"641","Name":"TjZOFLxxp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"642","Name":"kwLhXYoHt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"643","Name":"kwhSPuGwH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"644","Name":"BZmKyQaQZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"645","Name":"lFDzBqxhS"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"646","Name":"MOmpFzPpL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"647","Name":"PffrmIBlI"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"648","Name":"alaQrOKnW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"649","Name":"BrMdOmKan"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"650","Name":"NJgDRcZls"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"651","Name":"MvBzOrQjp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"652","Name":"dCUKrmvJZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"653","Name":"imMhFQxYg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"654","Name":"YAYijELnC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"655","Name":"nItLYhxla"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"656","Name":"KkdXFFbXN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"657","Name":"peGMVTloQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"658","Name":"yEJsFbOuE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"659","Name":"YgqMZpbiF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"660","Name":"lXZDUFgta"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"661","Name":"pqgmKNyrn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"662","Name":"kePxpVuAs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"663","Name":"EfGekUEix"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"664","Name":"nJoLBPhKM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"665","Name":"DPnhBzPDM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"666","Name":"xMwlbHevO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"667","Name":"ChXEbIzPF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"668","Name":"tWoPfjdDU"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"669","Name":"MUGUguMXc"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"670","Name":"hwQTSPVhq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"671","Name":"bRGxHwEQb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"672","Name":"hOHblXJsp"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"673","Name":"CzktbaOBs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"674","Name":"GKNpfTAbh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"675","Name":"RtoTLOZLY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"676","Name":"mTrbEEFoa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"677","Name":"cxBqNgIUG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"678","Name":"ksKEuZrMs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"679","Name":"zIyVZkgUD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"680","Name":"MYwtQYufn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"681","Name":"carwjygVE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"682","Name":"ltyncmwcb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"683","Name":"bGcmRLwUx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"684","Name":"gfwjttXcZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"685","Name":"nudaBNWHO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"686","Name":"IwhipLQru"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"687","Name":"qpIccTGMf"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"688","Name":"jufTMBXbh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"689","Name":"oiRZvfwXD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"690","Name":"wDzouuGQD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"691","Name":"DcMLGnnnV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"692","Name":"hFftzyKtW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"693","Name":"KfXyVUdOR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"694","Name":"AFXkxwScv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"695","Name":"AgLfJVNUP"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"696","Name":"zuRAffYIx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"697","Name":"TrfoWgvna"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"698","Name":"miFNlBbRe"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"699","Name":"ompyMvlyX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"700","Name":"DXbhdbAHH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"701","Name":"HWxxpBWFk"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"702","Name":"XodPvXvJz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"703","Name":"mrqBYOFiB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"704","Name":"jYJPHeLat"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"705","Name":"LZIwFKdFO"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"706","Name":"mijJYLPOQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"707","Name":"uhaqjFTgR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"708","Name":"bYGIncQdV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"709","Name":"XUTBDNBGW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"710","Name":"QdSJBYyhD"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"711","Name":"yBgQHZHae"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"712","Name":"mIKLhrEZs"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"713","Name":"sERNqyjNJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"714","Name":"rMMEQtrEo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"715","Name":"iFiOVXfiL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"716","Name":"cLQPMINvy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"717","Name":"oppwHqswT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"718","Name":"tzIOJHyYi"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"719","Name":"IYfesRLBg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"720","Name":"ipWCAMoqk"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"721","Name":"iWXmcGWMw"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"722","Name":"yiSkPPWBx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"723","Name":"VpHrGfmkj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"724","Name":"TMlUtybbl"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"725","Name":"UZCAhftOv"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"726","Name":"wYLrPgMUT"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"727","Name":"LWxxgQXGB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"728","Name":"iEqWPUPYV"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"729","Name":"MXpBNTBjR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"730","Name":"XTnMspmtJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"731","Name":"lINCgPkUo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"732","Name":"BAnIGGKku"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"733","Name":"aguDqZkRn"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"734","Name":"siMBcuNhu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"735","Name":"ykjPcViRR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"736","Name":"jOjSTICVK"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"737","Name":"zUdhMTrdJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"738","Name":"bjeNLykak"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"739","Name":"CRgbVyrYt"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"740","Name":"PLtTFUhwq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"741","Name":"pVjpAnuUW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"742","Name":"yDdhRnxwG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"743","Name":"UiDpXwKWj"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"744","Name":"QWBWyuuXm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"745","Name":"uvIMjcbYQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"746","Name":"LRIrjqAFG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"747","Name":"ThoqoTLNb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"748","Name":"sRIiPHguk"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"749","Name":"yDxeePTsg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"750","Name":"nEkicHOXW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"751","Name":"uYyGcsNzF"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"752","Name":"OTpbebGUQ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"753","Name":"bLtbbLKrY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"754","Name":"vDMFGqHkX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"755","Name":"QWMVpafIX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"756","Name":"rUxFvEYTC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"757","Name":"nKJxrOEmu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"758","Name":"vmedzzXdg"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"759","Name":"rsaiCBcVR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"760","Name":"ITnJdrzPH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"761","Name":"IuCKRdJLo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"762","Name":"hHHNFjyau"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"763","Name":"XAqSEEuvW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"764","Name":"CAbbZfQwX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"765","Name":"PNvNOnGNH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"766","Name":"tTtsxWOPL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"767","Name":"ChusyBGPM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"768","Name":"ikAsCcnGq"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"769","Name":"PxVIpoexx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"770","Name":"fOKuEaPdZ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"771","Name":"VZGgFXqBm"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"772","Name":"lQEUJOFvE"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"773","Name":"MCbjToghz"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"774","Name":"BHhxrblFN"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"775","Name":"IdSTPvWrB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"776","Name":"PJHDJHEPr"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"777","Name":"KAiEJhGvJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"778","Name":"wfupKtmws"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"779","Name":"IkVgPTzNL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"780","Name":"mxYccwXtL"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"781","Name":"mpxuVkQYx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"782","Name":"zmOpgaKor"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"783","Name":"YjHmkyADW"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"784","Name":"veYSMCfMb"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"785","Name":"jHDwCOSKR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"786","Name":"PBHcnvhyo"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"787","Name":"MasRcOnJh"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"788","Name":"aziZoBwkM"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"789","Name":"sprvcIJCu"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"790","Name":"cFTJVsVYC"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"791","Name":"wtDZQuYZk"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"792","Name":"MUSwtTpaY"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"793","Name":"jWjmVTTnJ"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"794","Name":"XzHekLjEx"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"795","Name":"yJSlKezcR"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"796","Name":"qITGsxIil"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"797","Name":"EXZuEqGHy"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"798","Name":"hTJwuTXop"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"799","Name":"UxjsZfhqB"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"800","Name":"pxJvNMzDH"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"801","Name":"uIVOzzfHa"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"802","Name":"yTGIsFWyX"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"803","Name":"rKKMNpyiG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"804","Name":"LcbtgoooG"},"emitted_at":1673989568000} +{"stream":"Sheet6-2000-rows","data":{"ID":"805","Name":"VgxUyhGdi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"806","Name":"aEbPtmFmu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"807","Name":"UtBgGUWVs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"808","Name":"pgXgbbouK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"809","Name":"QqAIFsIeq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"810","Name":"lIDEEEvZE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"811","Name":"KetciCSpw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"812","Name":"EyVqliLVu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"813","Name":"DOYfuXDZS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"814","Name":"wZZiMcJgj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"815","Name":"fGttTgUNi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"816","Name":"skXVCivmf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"817","Name":"OVPLIObhl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"818","Name":"BIiBmPstp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"819","Name":"EKAqRsVfO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"820","Name":"cpGoabbWs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"821","Name":"mvKhqFMsg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"822","Name":"fMQUuMkhR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"823","Name":"xfKwdZWUx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"824","Name":"LjzluzMaE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"825","Name":"qAaLCEaUk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"826","Name":"jebEhKSGU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"827","Name":"iYhxlUWHZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"828","Name":"FMdoXPovN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"829","Name":"YMFJwUuZw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"830","Name":"CyKLPwhDj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"831","Name":"TkhkaDUHS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"832","Name":"vLXzJfEAk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"833","Name":"ksRBSfAxr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"834","Name":"BpXqHILRC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"835","Name":"VPhegaHXd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"836","Name":"oKYiRJERt"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"837","Name":"aMPpcBDcC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"838","Name":"nIvbNWuPK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"839","Name":"jDxKqBGXU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"840","Name":"OcGTmjDlj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"841","Name":"kkAIaNSHx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"842","Name":"zlvdSkICV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"843","Name":"GjPkyNWFd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"844","Name":"jlUsyRQIJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"845","Name":"tbUbcXyXv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"846","Name":"PKANXUrID"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"847","Name":"hKqaTpuWv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"848","Name":"VhAVxreAL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"849","Name":"AvJADzqap"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"850","Name":"exMtaSqHF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"851","Name":"KZjaaCoUA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"852","Name":"smgwMTMDv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"853","Name":"utukeevIN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"854","Name":"LIIpQLMQz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"855","Name":"cdsydJADF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"856","Name":"HgWPegBLp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"857","Name":"WulhxGPyG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"858","Name":"XJyzNfZnw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"859","Name":"fpiUuWiaM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"860","Name":"vgkrlSFhZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"861","Name":"wPGZdaNHh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"862","Name":"ttYTXjgTs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"863","Name":"JUggTwfeJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"864","Name":"MdXlmqMSN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"865","Name":"KQVuCoxPl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"866","Name":"RHrgXMqhE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"867","Name":"OyhgAzmrs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"868","Name":"yapnDdsXe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"869","Name":"CDghLJWwF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"870","Name":"ZSQAWLAbP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"871","Name":"gyQAIufzn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"872","Name":"mKpQJwkEW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"873","Name":"DoEICtYjV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"874","Name":"eyyOaeDId"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"875","Name":"DVaFYQOje"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"876","Name":"ulkrxLyjG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"877","Name":"VxGeTpHub"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"878","Name":"LFSxoxEWf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"879","Name":"zNPpLdvqp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"880","Name":"hByLYeZmh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"881","Name":"FoyUfJfQB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"882","Name":"fDliVBvJO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"883","Name":"HPpfmjFHv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"884","Name":"RTHynjAYb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"885","Name":"GRyedwRxs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"886","Name":"CHWGLTUJa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"887","Name":"doGHHMuDk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"888","Name":"TOXevEyuG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"889","Name":"ftPDzOeQP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"890","Name":"RTNWxrrfT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"891","Name":"BLBhqLIcq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"892","Name":"EHQsXPcPq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"893","Name":"mZfSOmdCd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"894","Name":"XAgDERrZQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"895","Name":"NbKssWULF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"896","Name":"XwUTKOEHX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"897","Name":"rApSQwJpn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"898","Name":"IFMrQszOV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"899","Name":"dSnJmKdpx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"900","Name":"gUgJexXqR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"901","Name":"rvDJOwPIl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"902","Name":"bXsbfEhvs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"903","Name":"fETUGCiyq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"904","Name":"rphZBIIgK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"905","Name":"tsdtUvdQB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"906","Name":"SXJmdzlEd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"907","Name":"wCTsAHWzA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"908","Name":"LIiNaNGwe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"909","Name":"KDcYsUbUX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"910","Name":"YCYUmlMPY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"911","Name":"yNokcsMlN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"912","Name":"PUlkQogmN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"913","Name":"LGZDfdbTD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"914","Name":"cocfYIYUV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"915","Name":"heByRJARu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"916","Name":"wjaWLQxVY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"917","Name":"vtPRivuRk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"918","Name":"SEwoYfEQb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"919","Name":"PvkkccqIn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"920","Name":"NQXBUVnav"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"921","Name":"FPQFUtpsz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"922","Name":"aIvlLozhX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"923","Name":"GKRixsJSe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"924","Name":"wUdHXiMDL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"925","Name":"QEqlKjEov"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"926","Name":"NtDYDJWJK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"927","Name":"hOXMAiGzp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"928","Name":"wTiMSYWRU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"929","Name":"WFqFPSPzk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"930","Name":"hZzYzwOQV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"931","Name":"LNogdRNVR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"932","Name":"ACyXrUyup"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"933","Name":"PRpSiuMqS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"934","Name":"WMMiSTVAO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"935","Name":"lcWlQKZUE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"936","Name":"AQFwSjriS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"937","Name":"fmImItBpz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"938","Name":"RbDXrftIr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"939","Name":"SNKJxTIzK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"940","Name":"ymPkqWSET"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"941","Name":"QcrSrcFqd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"942","Name":"ExSTDqLQD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"943","Name":"KWLHUzpiB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"944","Name":"kkwMbgegr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"945","Name":"OjAZQkQwl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"946","Name":"nrRWxWVio"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"947","Name":"BbMuoLtTf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"948","Name":"tewJnpUqt"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"949","Name":"TlUNpXLkO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"950","Name":"KYziVFbEx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"951","Name":"aWlpQjaYH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"952","Name":"nrhxQpBkz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"953","Name":"gnxnrNqLQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"954","Name":"SJQpVdDhq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"955","Name":"CJgWupNya"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"956","Name":"XNshhlFqY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"957","Name":"KtaxpqwLa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"958","Name":"FCCGZaYFa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"959","Name":"wjWwBnQuS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"960","Name":"oCYxItqot"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"961","Name":"blaKBvMvQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"962","Name":"xAxODhHyQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"963","Name":"zogAXuJfY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"964","Name":"vHSpzOqRM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"965","Name":"wrrpQHpsj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"966","Name":"cBCLRdAsp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"967","Name":"mTncrumWf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"968","Name":"hVYCQIIgh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"969","Name":"LMTZOMqio"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"970","Name":"QjPhxpGKT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"971","Name":"cOKjBbYVq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"972","Name":"WBvsXJKyu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"973","Name":"wWYWRkVsT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"974","Name":"wJlmOIiFn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"975","Name":"drzgKTKxX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"976","Name":"LigAewtUG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"977","Name":"vSGCKUJRM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"978","Name":"OTHOCNtFC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"979","Name":"CHREYUnqT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"980","Name":"kkQtElfLu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"981","Name":"eRVXuHcSg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"982","Name":"EIcbaknCi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"983","Name":"NkMDnhyGy"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"984","Name":"eUJbSYchR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"985","Name":"RmqUKhSVD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"986","Name":"ILvHoeoBQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"987","Name":"jlJbRVEWc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"988","Name":"UiXKmWZZL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"989","Name":"rntHkWTLl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"990","Name":"pwWoSZCKI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"991","Name":"dlaYjyDbm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"992","Name":"bFzXSPkBY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"993","Name":"OBVFJFFls"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"994","Name":"wiJgETdXK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"995","Name":"lvjiEqpId"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"996","Name":"QUBlMjVpP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"997","Name":"fZZGDPomq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"998","Name":"oBmdqoMSH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"999","Name":"SGtMmBQDu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1000","Name":"KOAzNypSj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1001","Name":"bxnyqzZVb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1002","Name":"FvXpfgaPP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1003","Name":"MdnuKHWNK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1004","Name":"AyPOhmhTl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1005","Name":"BlZHCYSNQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1006","Name":"XZHLTEAns"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1007","Name":"yHmUijbYU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1008","Name":"ZkuWiHwLW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1009","Name":"qYJHxaLHP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1010","Name":"QoWCXjsFP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1011","Name":"NwMUHUOUz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1012","Name":"zRLPidwIM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1013","Name":"zbVbJahJh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1014","Name":"csPzXmRqa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1015","Name":"OjcnMrXtZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1016","Name":"tlogkASTl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1017","Name":"JpqYbbtXL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1018","Name":"NCnCJoInY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1019","Name":"iHZsVIqvA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1020","Name":"WfhDrKSck"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1021","Name":"cyyfduQJO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1022","Name":"IPJpkbWCK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1023","Name":"rXRyiqXsg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1024","Name":"qCZtetBRK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1025","Name":"utbVGNfWs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1026","Name":"MKcskAmSn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1027","Name":"rLQsJNDbF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1028","Name":"cqYPqToub"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1029","Name":"EElBChJbl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1030","Name":"GHvdYErIh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1031","Name":"kVcHsHOOO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1032","Name":"UfhbtDigl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1033","Name":"EmwdYVAiW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1034","Name":"CLAZeGKuI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1035","Name":"zSvYgUDdL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1036","Name":"QhrtrfscR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1037","Name":"YzWNgshXi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1038","Name":"mQmyyEMKs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1039","Name":"UhMdGtnGl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1040","Name":"YlaBFiRRS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1041","Name":"HphSozsQr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1042","Name":"xfssDkVfP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1043","Name":"ZBiysAWQj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1044","Name":"WriPwjTcz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1045","Name":"SLROhFFlF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1046","Name":"sYtOSAaWg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1047","Name":"WADyfVrpw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1048","Name":"OosKkUtpo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1049","Name":"qeFkUdWah"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1050","Name":"dPKkiahoP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1051","Name":"hLgngNewy"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1052","Name":"PVxnHwtlN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1053","Name":"tjYEDnhPn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1054","Name":"RagGmijpt"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1055","Name":"KLgkcPRnO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1056","Name":"VeBufszVH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1057","Name":"YwgzjiVWH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1058","Name":"xZTKTULER"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1059","Name":"fvhzVCQoj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1060","Name":"thjeHFJdd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1061","Name":"pLCUCvFCj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1062","Name":"TYtXrwWEx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1063","Name":"jkhKhxOFp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1064","Name":"mwFBqxkUn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1065","Name":"eAvbVGhig"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1066","Name":"MsGnAOEAw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1067","Name":"ixkRZNoXm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1068","Name":"rnfnSURci"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1069","Name":"mIQbIUkfy"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1070","Name":"kmipVMYHD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1071","Name":"GYwPWwGiA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1072","Name":"kHctjktzu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1073","Name":"vQzDSFeNX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1074","Name":"PZRvHllcC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1075","Name":"gSFQOvgNW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1076","Name":"DXHHndoeB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1077","Name":"auuLTgSSb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1078","Name":"fZVjPdoqv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1079","Name":"BKqIhMatY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1080","Name":"iBiIaMCYm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1081","Name":"WgyfNbgCk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1082","Name":"uUeTieNPq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1083","Name":"onefjlpug"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1084","Name":"vkGyaOedF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1085","Name":"BHlUiVeet"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1086","Name":"oDcdaZsCR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1087","Name":"IKhQGxQjC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1088","Name":"zHaGTCeye"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1089","Name":"wSMFeIcmd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1090","Name":"MrehtMXlE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1091","Name":"KhxIQWKSQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1092","Name":"jNMdcArzp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1093","Name":"oBWvWkFcf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1094","Name":"LiOKhcqye"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1095","Name":"trxfMcVsF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1096","Name":"pZYlVzxQh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1097","Name":"NOEajLVee"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1098","Name":"iTjbtuwIK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1099","Name":"PKgmWgKPx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1100","Name":"eyFhaKXDR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1101","Name":"VZtsaMXTT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1102","Name":"kTxfWEcuN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1103","Name":"mkGsUaEJE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1104","Name":"TjCTlNnlB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1105","Name":"VOFKlZCdq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1106","Name":"gwMuSxlMv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1107","Name":"hLJCgNXgz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1108","Name":"qPPVotyFT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1109","Name":"UxuQYExZY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1110","Name":"SvNzfMefQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1111","Name":"mMivrGmgf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1112","Name":"ISzRmoBDz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1113","Name":"NThlXBxYX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1114","Name":"UToweBKOk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1115","Name":"cmOBaFbRn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1116","Name":"bpUVHGDlV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1117","Name":"JQaDekkeX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1118","Name":"bvonyBcjm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1119","Name":"MHcVnBHQe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1120","Name":"IfSBLjnyj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1121","Name":"sVxzSupCd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1122","Name":"YZrUeyeuj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1123","Name":"wwHrfmaMz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1124","Name":"geVvqDxwy"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1125","Name":"DMjqcqgpa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1126","Name":"vpQYQnbgg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1127","Name":"wlLXJzfMr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1128","Name":"okZjkTjdM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1129","Name":"lswJDzuGz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1130","Name":"NsZyqXcTQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1131","Name":"WpWCVAgWo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1132","Name":"npsKqAkxm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1133","Name":"DocvLqQAE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1134","Name":"ILysPGpqo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1135","Name":"AzBQgAHTV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1136","Name":"XqhojWLWZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1137","Name":"cSIJEtpGA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1138","Name":"aswpzMSns"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1139","Name":"RZaVanfDh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1140","Name":"jJgWtmsCK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1141","Name":"UHldyWCEA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1142","Name":"sGeqSwYEU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1143","Name":"bmSyuwEPY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1144","Name":"vBLodKNlo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1145","Name":"pTomyGknJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1146","Name":"uVVmaaARb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1147","Name":"jbqwXhZyc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1148","Name":"VCelNYzuW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1149","Name":"YZaxkEgAO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1150","Name":"mrXBLGjtU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1151","Name":"oXpmTGCmv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1152","Name":"JRksWtdeC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1153","Name":"XesGKPeXU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1154","Name":"xwkIBEXLU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1155","Name":"kzEzjvdZV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1156","Name":"mXuAUWyht"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1157","Name":"DtQXcQRQN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1158","Name":"umQWhZAGU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1159","Name":"vZvQuaZwa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1160","Name":"HyaljwDKD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1161","Name":"wxfzzykdI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1162","Name":"kwuVHauvC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1163","Name":"emdlffTIM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1164","Name":"qDACdHpYH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1165","Name":"dBTPxAfxL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1166","Name":"oDkRVAcKI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1167","Name":"MMdnvNmdT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1168","Name":"uekZTrkdm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1169","Name":"NpAMQiMla"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1170","Name":"wQBVGBEra"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1171","Name":"rkGbvxqMh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1172","Name":"TbBEXiIla"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1173","Name":"ITiiJMJVH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1174","Name":"CNcAGZjav"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1175","Name":"YfqxDonZr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1176","Name":"ixcKuFixQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1177","Name":"UUQEubTCl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1178","Name":"sdXyoLlAo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1179","Name":"cUWPsOsWY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1180","Name":"WONUHLSII"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1181","Name":"oBktSMFQa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1182","Name":"tSbOcQxTu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1183","Name":"spzMpRizk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1184","Name":"dzYuXtQGZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1185","Name":"uqWnTVtAI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1186","Name":"WSMGChrhK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1187","Name":"xnxnVokyZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1188","Name":"dwtOZQFpT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1189","Name":"ZszVsGdth"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1190","Name":"YFulYdkpX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1191","Name":"pDGZafurX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1192","Name":"OGqiSDPiW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1193","Name":"ApJkYhNZV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1194","Name":"sEtnAHLmj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1195","Name":"FjDDqXJcV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1196","Name":"jJBazBPOX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1197","Name":"EbqFmnRZI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1198","Name":"EuQICHsft"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1199","Name":"imOljIjxN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1200","Name":"JeZYcCuKn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1201","Name":"tEFXREYnY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1202","Name":"xCyiHJFmP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1203","Name":"wnuwyJktf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1204","Name":"ylbPywWSN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1205","Name":"HNQjEnrfG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1206","Name":"rEUCCjqFe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1207","Name":"kHGYaeFOU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1208","Name":"ULDUcqoBV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1209","Name":"yeTIrHZWq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1210","Name":"IlrBiqAQc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1211","Name":"eqwIRXhpo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1212","Name":"LgPftMEYZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1213","Name":"MsJQSopzB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1214","Name":"tIbViNgXP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1215","Name":"LsSrhuWOk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1216","Name":"MwbBbEkpb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1217","Name":"IavgETcWE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1218","Name":"QXjPXeztc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1219","Name":"XfMDFDbyj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1220","Name":"rrKdnWFSL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1221","Name":"jhRLcoJnf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1222","Name":"VgDMPhoDV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1223","Name":"lWecThfGH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1224","Name":"JoEwWHMcE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1225","Name":"lsieTBswW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1226","Name":"EgooeooWI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1227","Name":"BtwrRfFun"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1228","Name":"tHRfUMooJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1229","Name":"VEmKdkHzb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1230","Name":"IPPftVeSR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1231","Name":"RpnDROAiF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1232","Name":"DRojcuANe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1233","Name":"fCQYtUOoJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1234","Name":"umjzCxYkg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1235","Name":"ZzTSxugwW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1236","Name":"BDqrHBQSe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1237","Name":"SoXgOIgss"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1238","Name":"haFVacysi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1239","Name":"pjOkMMUSN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1240","Name":"xsvbNPruj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1241","Name":"BggTmpfUG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1242","Name":"KCmzalpYl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1243","Name":"DVAuKHhRO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1244","Name":"pAIkVFJVr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1245","Name":"CMezmpKYt"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1246","Name":"KxGhNEHmM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1247","Name":"HRexJPyeE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1248","Name":"hFqZpvWOi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1249","Name":"eOlAvfRjZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1250","Name":"QVcUGIWmT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1251","Name":"MvAOQiwnU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1252","Name":"GeADVqMub"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1253","Name":"duVxiXaSN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1254","Name":"DzZjWfIry"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1255","Name":"bftBOgqXg"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1256","Name":"zPKmWSECs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1257","Name":"LwLAyuSYM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1258","Name":"RAWiHGrcP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1259","Name":"CYbtrOucc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1260","Name":"FRUURLxaP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1261","Name":"RcJLEskUA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1262","Name":"lQiZihgpI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1263","Name":"EraYheTyh"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1264","Name":"hdAVZwrba"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1265","Name":"pxwDcTTlx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1266","Name":"UbLpynLNB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1267","Name":"quHkgijnG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1268","Name":"LhAPdWfNQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1269","Name":"qWzhPDrbp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1270","Name":"eoecnNTwF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1271","Name":"GPLkcqKLn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1272","Name":"KqVgAFYYD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1273","Name":"xrJsQqEgx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1274","Name":"XNaVRgVxb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1275","Name":"HqimsAQDN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1276","Name":"mvwxOBSJO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1277","Name":"rQddpfBag"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1278","Name":"EPnbMQkld"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1279","Name":"QLIHoxXRY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1280","Name":"YxdRwiuWU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1281","Name":"eeqyHBFLG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1282","Name":"ClQQMNvdp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1283","Name":"ANWPQiVvr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1284","Name":"uzTKPQGgB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1285","Name":"YfBSKJFpi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1286","Name":"FQypeurVd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1287","Name":"ZVXCAJcAt"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1288","Name":"mcOfTiZUO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1289","Name":"fnoHiqMTB"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1290","Name":"MLmlozWZQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1291","Name":"QzYNPVUVM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1292","Name":"XZwVIsNDi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1293","Name":"FburHKHXo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1294","Name":"NQyFWbWpL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1295","Name":"QhPfiZXRG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1296","Name":"bmULpPSZL"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1297","Name":"WpXREJxBA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1298","Name":"FnUMqKCiM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1299","Name":"GIsqfuaKm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1300","Name":"CkjTsGVfJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1301","Name":"WtqHBQnqV"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1302","Name":"GcNgDcDEH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1303","Name":"qsGQMFvMU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1304","Name":"MpnvajTKG"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1305","Name":"xpBDYldDQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1306","Name":"LGzObmlLn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1307","Name":"HHEaIghYv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1308","Name":"QuXchRhZI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1309","Name":"grbjspfjm"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1310","Name":"GHRjmMxzY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1311","Name":"kqUtnrcbf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1312","Name":"hQrPTtOQW"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1313","Name":"FneWMeuyH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1314","Name":"micuoSiIl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1315","Name":"BCAOyCyMa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1316","Name":"NQXZlrHiH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1317","Name":"fNMBWYRfr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1318","Name":"CYKQgZnse"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1319","Name":"tEzXGRxNM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1320","Name":"UvRLthGfO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1321","Name":"mLLDBvwPA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1322","Name":"nMQXXpXxE"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1323","Name":"wJbwsvxhR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1324","Name":"acAzQjjwQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1325","Name":"NAgOCrqss"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1326","Name":"mYgEAwNfS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1327","Name":"yTGofbSjl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1328","Name":"xvhlaDzmS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1329","Name":"WNAPqnwnQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1330","Name":"pbWKZUUPw"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1331","Name":"pWWcoxJoo"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1332","Name":"TBesPTOrY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1333","Name":"uchwFyFTX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1334","Name":"HHLDsfyDa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1335","Name":"bKRdlSaQI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1336","Name":"UkFNVrsna"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1337","Name":"ZDSZGrRDk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1338","Name":"LOdUXrQNs"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1339","Name":"xHfjuzACl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1340","Name":"eTbycMfus"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1341","Name":"mlFLNvNcd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1342","Name":"UdsRTPHlI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1343","Name":"ByJZQdMSx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1344","Name":"gmjmqOlBR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1345","Name":"EQnRHYjhS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1346","Name":"pCcuqUcDD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1347","Name":"yhGKcSZfz"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1348","Name":"BagxsUrYI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1349","Name":"TvfasuESb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1350","Name":"zzRVdMMUT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1351","Name":"JULytcrBO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1352","Name":"GHxpoUadl"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1353","Name":"DxvtdSGSu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1354","Name":"uTmoLrpmJ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1355","Name":"mXzSLLopR"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1356","Name":"AbkkRwGYb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1357","Name":"aDbCfjTrc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1358","Name":"HcsoQTmJv"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1359","Name":"QrbgKayVa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1360","Name":"zcahMmIrP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1361","Name":"HaoFdizkd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1362","Name":"cxdLYrGam"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1363","Name":"VRGwMPJPc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1364","Name":"GsoaxlvkH"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1365","Name":"dRArSdSxu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1366","Name":"kcssSVFxc"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1367","Name":"zqqCnqaFC"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1368","Name":"ZZmZxCcFN"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1369","Name":"DpbJHVJcY"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1370","Name":"njrkgcDse"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1371","Name":"ZyxFDNJBP"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1372","Name":"geDsWNWIM"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1373","Name":"CMFtIEKqe"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1374","Name":"GoAesalFZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1375","Name":"CixatjOsZ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1376","Name":"YZRUAlWfi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1377","Name":"kXpNkLrlO"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1378","Name":"YOWUcKHCQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1379","Name":"SaRdNMlwT"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1380","Name":"WjezeTPOS"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1381","Name":"rvJZcqOOK"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1382","Name":"KziZSoUSb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1383","Name":"GoxriWuhI"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1384","Name":"PMSArvwnj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1385","Name":"GYaUMHqPn"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1386","Name":"niBePoAOd"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1387","Name":"NHeicZRXf"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1388","Name":"ZYLmArrJa"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1389","Name":"mQcESbySQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1390","Name":"muAiTRDkA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1391","Name":"zYdHIhTFk"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1392","Name":"ezYfXBwNj"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1393","Name":"gMrezEPgA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1394","Name":"sFolZQlDb"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1395","Name":"akPPEFhAA"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1396","Name":"VOjTtoKDX"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1397","Name":"UiEWdLjcu"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1398","Name":"elCWKkgeQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1399","Name":"nutMuXqbp"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1400","Name":"UCjpDWaoq"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1401","Name":"jPszKqRGr"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1402","Name":"qWMpnmSDi"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1403","Name":"BkOeQTdBQ"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1404","Name":"eXgvujDrx"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1405","Name":"ChoqAlWXU"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1406","Name":"RxuuDRBGF"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1407","Name":"CiEHZhDDD"},"emitted_at":1673989569000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1408","Name":"YRSWnwuuC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1409","Name":"UMPGfsblt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1410","Name":"bESHxNtyJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1411","Name":"uRoYzJZWj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1412","Name":"haFrZaawh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1413","Name":"BYRUAbkvs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1414","Name":"lBohVUuwU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1415","Name":"AbSwpRlcF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1416","Name":"mRjtRznLW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1417","Name":"usvNKiEgu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1418","Name":"NoXymywqn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1419","Name":"EFQLrKosM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1420","Name":"TPDOeCOkZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1421","Name":"kPurDLnLe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1422","Name":"FlDnZJFSe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1423","Name":"OiHVAkKiH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1424","Name":"nRtYcQiLD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1425","Name":"grgYXECRs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1426","Name":"nVQeESoAw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1427","Name":"fiSztxVLo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1428","Name":"mGsOhMWyH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1429","Name":"NkeBZlQbc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1430","Name":"vAmFhPfyO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1431","Name":"kelhsDiat"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1432","Name":"NfrmbEVoP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1433","Name":"lPGhMGqnj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1434","Name":"LmJkdYGbU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1435","Name":"cZZdRhleV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1436","Name":"rXIPnTvTz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1437","Name":"eQPOTBgUE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1438","Name":"YFcvpbszb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1439","Name":"IKMZnAZHt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1440","Name":"QciNlZWyV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1441","Name":"JqPlkebNc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1442","Name":"qDiVAomHo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1443","Name":"WNGrPGPkK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1444","Name":"DCArfmUNl"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1445","Name":"ttMbInVMx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1446","Name":"gZjZQWeMq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1447","Name":"etrWzbjCL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1448","Name":"OgyElGZwL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1449","Name":"grDFRsAoK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1450","Name":"lUzLhURbT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1451","Name":"ptxWrqNBz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1452","Name":"JhiVuyZiT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1453","Name":"gVqUFppKR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1454","Name":"qFrYxEBOF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1455","Name":"ZmtNzGGWl"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1456","Name":"pPEUYBjFF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1457","Name":"vAkzBgMoj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1458","Name":"BCwvuZocc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1459","Name":"XqgtAuPzy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1460","Name":"BraGEfvpA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1461","Name":"TZJyINaqv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1462","Name":"xeGYgcCeX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1463","Name":"rbnoxVYeu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1464","Name":"cglWGYhCY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1465","Name":"RXuVoPusw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1466","Name":"QlkrlSGZq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1467","Name":"nOhJOzKUb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1468","Name":"jegzLKtmt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1469","Name":"VVEqtobEg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1470","Name":"CBMTqGIEv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1471","Name":"PbnjJgUdo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1472","Name":"lhQUrnSBD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1473","Name":"EvOAwTjMb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1474","Name":"bWUzLxSnK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1475","Name":"QtRynEduW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1476","Name":"tjZwZcuBK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1477","Name":"gChmJzgUR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1478","Name":"dZuhVKCdn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1479","Name":"ZIbXOPkRt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1480","Name":"xLtAovVMS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1481","Name":"RYZIcTeMI"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1482","Name":"ZdIlGZbLU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1483","Name":"NoQIuwuBF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1484","Name":"GUzaXoFDX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1485","Name":"WkBLpjtnm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1486","Name":"GOfyeTzuF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1487","Name":"yKfOzJfSJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1488","Name":"nffcvzUUk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1489","Name":"MaoAMQJQO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1490","Name":"lpXyhOJwc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1491","Name":"dSneeJcLb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1492","Name":"QqorwNgUg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1493","Name":"KCQiqXpZq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1494","Name":"AmMkxJFVz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1495","Name":"LcCYXSNBT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1496","Name":"OLyhouwoB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1497","Name":"sfToRQtAA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1498","Name":"BSHQIXxZQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1499","Name":"trPCeyUWs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1500","Name":"WhemAUDkN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1501","Name":"uyQrauQKm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1502","Name":"pkWccmKQc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1503","Name":"AhhadNuGO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1504","Name":"cVdWKIiLS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1505","Name":"ZGbDkEpwJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1506","Name":"lAEatsInM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1507","Name":"nZLlSpcQt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1508","Name":"HCECtypOn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1509","Name":"KmRDtAGJC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1510","Name":"uoIbARUqt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1511","Name":"ezgJnHQJi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1512","Name":"HbrYktpIq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1513","Name":"GpbvJheif"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1514","Name":"HlanhGFTL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1515","Name":"ffMeVviuQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1516","Name":"oXOHfjBiv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1517","Name":"lUimsJUcO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1518","Name":"zGnJvwmuZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1519","Name":"SqifSFueB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1520","Name":"mxKFyTUWe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1521","Name":"GFbKGZNlf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1522","Name":"YYzfTGcWr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1523","Name":"AJhHRrkPk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1524","Name":"xykNSJQOX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1525","Name":"qzKoQhBum"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1526","Name":"RuKDwlkiS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1527","Name":"UPgwzcYAp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1528","Name":"eaccHNDPK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1529","Name":"gUwcqoeal"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1530","Name":"fvmyFemxS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1531","Name":"CaAnuZbEK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1532","Name":"dlTUbaYOf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1533","Name":"dfgMhdbMp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1534","Name":"oDdDkAixf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1535","Name":"tTOeXirOQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1536","Name":"anZsAKIhr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1537","Name":"DwYwPizjZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1538","Name":"AeQQCWCNz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1539","Name":"oKJiWSphf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1540","Name":"EpwTRUHON"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1541","Name":"cIcscaGPO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1542","Name":"WfCpYkoxk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1543","Name":"TSNAgTxcm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1544","Name":"KJhlRWVrx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1545","Name":"DvPMxhxBL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1546","Name":"etryAwvVr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1547","Name":"HnujJakzf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1548","Name":"KGBWjsCtf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1549","Name":"GgDvlPtiz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1550","Name":"TyWDsGnCY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1551","Name":"BoOyrNuKa"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1552","Name":"XoFFIcIYA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1553","Name":"RwzIWSuVh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1554","Name":"VobCDildL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1555","Name":"phlEAszNT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1556","Name":"hUAbkzLFV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1557","Name":"SOisZsHtq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1558","Name":"btKMarFQZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1559","Name":"lTwWtAZMt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1560","Name":"WYuhtcvcS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1561","Name":"WrrYWfKDC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1562","Name":"HNMhLVrYA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1563","Name":"MnffaxwOT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1564","Name":"sAoPANban"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1565","Name":"UeKIRyxJM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1566","Name":"bDiquWMfm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1567","Name":"YeaxWpGeJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1568","Name":"ndLXqMbGS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1569","Name":"iVeCmogAu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1570","Name":"lOTXToxUW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1571","Name":"CckkxVXwx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1572","Name":"FisxvwFqV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1573","Name":"hHmuBQhzL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1574","Name":"VhGmRoCos"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1575","Name":"WmUkamrpM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1576","Name":"cwioJmqwE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1577","Name":"iIHDNULrr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1578","Name":"LKQnDjUjX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1579","Name":"FRMyOAoyI"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1580","Name":"DGOxKUBLG"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1581","Name":"lZOBAnlpv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1582","Name":"MaIboFxHu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1583","Name":"BsdtZLaLS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1584","Name":"tmeRlzJwR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1585","Name":"nYzDiiYDN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1586","Name":"DNDVNJXIx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1587","Name":"UBWdLOMXy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1588","Name":"GVjvGmhei"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1589","Name":"pmaZaFHQC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1590","Name":"RuplVPlwt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1591","Name":"NYlsgnTEx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1592","Name":"IvCJDkIti"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1593","Name":"waNubHkxJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1594","Name":"sMfeTgrJH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1595","Name":"HUHJirbFD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1596","Name":"DoFmcTobK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1597","Name":"OCzbLpxHw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1598","Name":"OVUSQtUeL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1599","Name":"gluLDWhyx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1600","Name":"aezNiwCjL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1601","Name":"htsElUgol"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1602","Name":"aXVUgEdkJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1603","Name":"QijlDlLvC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1604","Name":"WibRMVUlu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1605","Name":"OKidTaZga"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1606","Name":"SrDhBcZwb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1607","Name":"krmZsHuMg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1608","Name":"vzvrLGTZH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1609","Name":"hQTyIKtHW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1610","Name":"CoeftnBoH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1611","Name":"LsxByUjcr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1612","Name":"qrKGSdBEV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1613","Name":"VnSjUihoX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1614","Name":"nMyuMQLQo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1615","Name":"UaONcZETp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1616","Name":"VgGNGIEvM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1617","Name":"MLyOVQhmi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1618","Name":"pEpAmaagz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1619","Name":"vrHGUULfW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1620","Name":"rXgQkQDRE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1621","Name":"yPVWSvVss"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1622","Name":"LswiPQDbo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1623","Name":"lCsZNduNZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1624","Name":"MRocFayZn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1625","Name":"YmeWdRJEp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1626","Name":"fkHTewQOd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1627","Name":"dGPeAVjbP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1628","Name":"aiupwecpc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1629","Name":"scOjWyzyD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1630","Name":"xDRQuovMF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1631","Name":"vbiORpJts"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1632","Name":"MwqsihmvT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1633","Name":"RyFwwbXpZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1634","Name":"zGcGsbwEe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1635","Name":"ovsLqslBh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1636","Name":"SGGhLkFGb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1637","Name":"znebUZCSd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1638","Name":"aRnkZWqLO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1639","Name":"zhHpQJith"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1640","Name":"TXkhRvzqr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1641","Name":"XgqUjompU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1642","Name":"qfAaqXgyA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1643","Name":"xpIqHzeft"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1644","Name":"RokHqSuMZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1645","Name":"QApCXjFoq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1646","Name":"YOejCOFAY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1647","Name":"EbQcNDojV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1648","Name":"BFeRPWOWQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1649","Name":"BVXCMaMCn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1650","Name":"zdkNGusVe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1651","Name":"LRWGgpgbV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1652","Name":"aTPeBuumD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1653","Name":"rctLgBJbu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1654","Name":"CSIuTVbbp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1655","Name":"RVtZJyrVs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1656","Name":"rPngIxzqQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1657","Name":"ZgTFUopMb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1658","Name":"EkfqrYYlj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1659","Name":"oPlxYreYl"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1660","Name":"mhAkfWCDs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1661","Name":"WpuFZRsYE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1662","Name":"vdaoRlcWq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1663","Name":"ciCQwmnoH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1664","Name":"pPhSJqWRY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1665","Name":"vuSxamzZX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1666","Name":"usdsBgDHo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1667","Name":"YbIxIORFA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1668","Name":"NeVXHDKVt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1669","Name":"xPnNZMjRY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1670","Name":"DRcVmEXzf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1671","Name":"pDxMLTIVh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1672","Name":"ElPyhsjXp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1673","Name":"dZFjpRUBA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1674","Name":"lSjwJvuFN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1675","Name":"ZRziFdVnx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1676","Name":"azgPPNZhB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1677","Name":"GkvWEhIys"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1678","Name":"SQBFuDBsp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1679","Name":"SLcvuIYcB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1680","Name":"SqnZLveAk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1681","Name":"jeTfcvMoz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1682","Name":"OYLdBupTt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1683","Name":"GnEgDHpMv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1684","Name":"UsqtxLbWb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1685","Name":"zwASyasPy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1686","Name":"jxnIbvvGe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1687","Name":"lvjIHyvnN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1688","Name":"VqJjuiHUP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1689","Name":"yqkWozhho"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1690","Name":"xETOdfkpF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1691","Name":"yvXKGNHZE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1692","Name":"KVPoVLCme"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1693","Name":"SlkZIGIXy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1694","Name":"fXEFVmJTU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1695","Name":"jroeMrDYb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1696","Name":"cAxJyTArE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1697","Name":"MWPbvvTCp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1698","Name":"nDydKllDy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1699","Name":"HnKdRclys"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1700","Name":"RBxDPiogw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1701","Name":"RtrqctKLx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1702","Name":"RaPvevDFb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1703","Name":"IjwxPnoAa"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1704","Name":"QOgrbDNWh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1705","Name":"uhFqkpddr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1706","Name":"xUIcvZfxV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1707","Name":"GvTWcAQgZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1708","Name":"xVsvhJMUA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1709","Name":"evNwWMrEZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1710","Name":"DyOrDFNAl"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1711","Name":"IZLrbNFbB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1712","Name":"sffxdsusp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1713","Name":"vKApEoDAs"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1714","Name":"eTvMLNDgg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1715","Name":"XUVPsJSDw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1716","Name":"OujIjHYFI"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1717","Name":"yTDwBwxTT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1718","Name":"GhrHcljGu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1719","Name":"nCfBbhGqf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1720","Name":"bQTpepIoy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1721","Name":"NCefhXhGI"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1722","Name":"aJeJzXoUo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1723","Name":"euPFFEVre"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1724","Name":"PMjRjrxrU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1725","Name":"wJBVVpmUO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1726","Name":"HgzWxJaCY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1727","Name":"uXUxIbOGB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1728","Name":"YqxFqbvAN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1729","Name":"rIHMqRTBk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1730","Name":"wBlOGlqAz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1731","Name":"laZoKyCJK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1732","Name":"kZIZIPEtk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1733","Name":"oWjtrniXH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1734","Name":"rvdYOqNnS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1735","Name":"KlGCLaHVE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1736","Name":"KnOEqPWpm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1737","Name":"JOQARUXsB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1738","Name":"VgcNKllHX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1739","Name":"dwaLVwwQD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1740","Name":"fMyLFuTFT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1741","Name":"pUWHKBCie"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1742","Name":"XktCDkNdw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1743","Name":"BBsLZQHQt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1744","Name":"zyTiTHRwN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1745","Name":"yTRMHczRi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1746","Name":"PjbVLrAan"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1747","Name":"opJOwARtc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1748","Name":"MdRbTtcWY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1749","Name":"JwknjXYis"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1750","Name":"JlAngobXQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1751","Name":"BGIbuSMVx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1752","Name":"OubNoTPxG"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1753","Name":"ApqFgoWnX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1754","Name":"pTmmbfawk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1755","Name":"nINZzYXkp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1756","Name":"itvawLCni"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1757","Name":"OawxKdzhV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1758","Name":"xqeAEIECf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1759","Name":"boEfbpeXS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1760","Name":"tRJYIRwEo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1761","Name":"kgAExQWAG"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1762","Name":"ukrZVfNEx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1763","Name":"eXzYihCbK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1764","Name":"zLdRCXPFT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1765","Name":"jPTuWoRpf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1766","Name":"zOJpemMSM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1767","Name":"RqpSYIdzx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1768","Name":"QjlGVYauN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1769","Name":"YgMQjplJR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1770","Name":"qqiBdeaAS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1771","Name":"wtgyNsWlq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1772","Name":"tStORqzMi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1773","Name":"GofIFNBGR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1774","Name":"RHHhjmHbC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1775","Name":"YWGimTuCx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1776","Name":"rYiKkCrLq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1777","Name":"EywBiCfuB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1778","Name":"wVkRYZOwF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1779","Name":"VQaFbDnfL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1780","Name":"KAtbSXBwZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1781","Name":"NUVbeAMDx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1782","Name":"IJCfiWavT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1783","Name":"LuCDjpfVS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1784","Name":"frMUvLVHM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1785","Name":"bzXWoTNzO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1786","Name":"muTAHKSPw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1787","Name":"GotqLDJrz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1788","Name":"hWgLwiBPm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1789","Name":"NnjSxCLYd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1790","Name":"ytOEtWCCn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1791","Name":"fzmFAoXQr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1792","Name":"BTHmoXlpH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1793","Name":"MuoXFrron"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1794","Name":"MgXDhQCgu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1795","Name":"DkWRdjmpk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1796","Name":"fQSJjcbiY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1797","Name":"iVWRzRbbe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1798","Name":"JDzWYUsyq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1799","Name":"PgndGhUby"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1800","Name":"qTYxXWYSp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1801","Name":"RhMuipqku"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1802","Name":"rfLQgaOcT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1803","Name":"cVbFMROeo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1804","Name":"oMVqiajeH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1805","Name":"FJPVOufvh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1806","Name":"bFKPlowdk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1807","Name":"sROwmKYoT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1808","Name":"KCJDIIsjo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1809","Name":"QIULxIeFH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1810","Name":"LferBVQOx"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1811","Name":"OSjcYWZzi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1812","Name":"fNFKKDkwv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1813","Name":"aZwxZWuCV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1814","Name":"rezpNPnig"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1815","Name":"ViwMoLaUn"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1816","Name":"qWiywSHoa"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1817","Name":"KedFHdsQN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1818","Name":"PJnJRJciu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1819","Name":"SEGsXEsfF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1820","Name":"ERXAVRLWZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1821","Name":"rniHxwKpg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1822","Name":"KKhPUNIGa"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1823","Name":"JyJhzwcxP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1824","Name":"KuZosAbPu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1825","Name":"hlfwSooVU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1826","Name":"TQIjCErFu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1827","Name":"nyjCGSyQW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1828","Name":"ntZYVydbZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1829","Name":"UVUJqfacb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1830","Name":"YLUJMqUkV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1831","Name":"WWpstbWlB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1832","Name":"FylvuXiTH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1833","Name":"vKByGttMi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1834","Name":"noTvEkuKD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1835","Name":"weuhSDkfT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1836","Name":"EQGhgaOFw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1837","Name":"tRoeEMmjd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1838","Name":"cSNnEOGam"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1839","Name":"qdZLsWfnz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1840","Name":"qcQLJswhL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1841","Name":"XmkGhrLNr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1842","Name":"slZKDeInM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1843","Name":"owjFgQajO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1844","Name":"FJnTvDERj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1845","Name":"NXgsHfmMD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1846","Name":"QyqvXmBET"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1847","Name":"FaWXnZLHT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1848","Name":"QVNkatdUg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1849","Name":"tlQvaKuul"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1850","Name":"FUUZslNut"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1851","Name":"usRQwBslF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1852","Name":"sfnWHZkPy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1853","Name":"ZQjPhGunb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1854","Name":"YIfdvpGim"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1855","Name":"qqgfwijzX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1856","Name":"YvGoliocF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1857","Name":"OohRGvjWN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1858","Name":"mJvFeSIFo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1859","Name":"zhMtJJKid"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1860","Name":"gdAsnQXqc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1861","Name":"EqejFDwcu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1862","Name":"iDeAlhbCF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1863","Name":"jrDzTcnVC"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1864","Name":"xHTIMCtMM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1865","Name":"kGXhdyGrr"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1866","Name":"GowRBBatb"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1867","Name":"FXIUXeBIK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1868","Name":"ysKDIkUOl"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1869","Name":"YMBXDiNRi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1870","Name":"NChMyEvIp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1871","Name":"gNmPqNGym"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1872","Name":"wWOQgeVgH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1873","Name":"VFgVGsIHp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1874","Name":"YCbDhhzTK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1875","Name":"luVLnqArd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1876","Name":"GOfdAMdjK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1877","Name":"mLUuhdCJL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1878","Name":"yMBsqiWhO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1879","Name":"ARYAuqiXG"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1880","Name":"JQPxfqOvP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1881","Name":"ksgZuUnJi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1882","Name":"FIPGRgpZN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1883","Name":"xxdAwLLRR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1884","Name":"eSlYiBubf"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1885","Name":"dsyTgquTg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1886","Name":"WyCCCCZOi"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1887","Name":"sZfkSUGko"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1888","Name":"KoshTpMiD"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1889","Name":"EhDuYIfXa"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1890","Name":"oSrHKHaGJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1891","Name":"fzYRneYpz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1892","Name":"BWXJlVIHW"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1893","Name":"NHaUTNHJd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1894","Name":"EPfsnBiru"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1895","Name":"USzzdTLMo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1896","Name":"jGtEfTCEz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1897","Name":"CVyUIYovK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1898","Name":"rXAovyinw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1899","Name":"bJyDfSfTy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1900","Name":"hSQLmrDGq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1901","Name":"PTCURjUPS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1902","Name":"XGyrxpmNY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1903","Name":"EeoZxAlSA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1904","Name":"yRLMrQcQe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1905","Name":"gyChRxXLd"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1906","Name":"VELqQOqLw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1907","Name":"hXNTxAdrX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1908","Name":"cmetNLzSu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1909","Name":"AdZGxKGte"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1910","Name":"mDtNfXzrA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1911","Name":"YDIRZPbja"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1912","Name":"rsEoIedKX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1913","Name":"fvnAScCDE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1914","Name":"mfCFwNgVe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1915","Name":"pvZXiDsNy"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1916","Name":"LGXXpPPIN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1917","Name":"LXwGAnRmj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1918","Name":"QbzTuJaic"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1919","Name":"UDoIdTbFV"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1920","Name":"okbwlcirZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1921","Name":"xdvuZjfrc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1922","Name":"NiPeqbaZo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1923","Name":"yoiQrdkin"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1924","Name":"EQIqKfLwv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1925","Name":"KCrxupgFN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1926","Name":"CnAgcBvCS"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1927","Name":"NfErjinJM"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1928","Name":"MYjGuJVtp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1929","Name":"VsySGYvuZ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1930","Name":"RFEXsXXjN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1931","Name":"yNaVywKpu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1932","Name":"YzFCakYWQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1933","Name":"zIrdXfDdu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1934","Name":"CmnvGGaRz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1935","Name":"wLXdmNaUB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1936","Name":"JTYvvUFWo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1937","Name":"XCZEptOqU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1938","Name":"SwJVlfcyh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1939","Name":"nWqPxfKsJ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1940","Name":"qhwuLySEX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1941","Name":"QkBLHraxe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1942","Name":"jmwTwSRDR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1943","Name":"rNKDmJZTv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1944","Name":"ISBmlRfOU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1945","Name":"iXhOWBVEA"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1946","Name":"afYJwrEaP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1947","Name":"QipBDdDxt"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1948","Name":"kNKSuYABX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1949","Name":"phJJnoQBh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1950","Name":"atJlfXHBR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1951","Name":"InTRngtDE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1952","Name":"lBjIjfVnc"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1953","Name":"hExPNbIqw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1954","Name":"PwDzfwFpq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1955","Name":"NUoMQrisY"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1956","Name":"njtBQMSWL"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1957","Name":"uyidcHvlU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1958","Name":"gXDaGdpqO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1959","Name":"JTwAdjOPh"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1960","Name":"tgZJWgCMm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1961","Name":"uhlqDRQtu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1962","Name":"LlLZImgEu"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1963","Name":"uCVSIGtBe"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1964","Name":"hvwFxmaNo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1965","Name":"ORKGOKrUk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1966","Name":"KDJZQriFQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1967","Name":"mKehEEnoq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1968","Name":"PaejmAeDp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1969","Name":"zBsmQHAeg"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1970","Name":"UHnUpDNKk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1971","Name":"trvAfDKeq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1972","Name":"gaveXBURT"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1973","Name":"dxMcRWBrQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1974","Name":"FfMxrsqxq"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1975","Name":"WOmKLuKyH"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1976","Name":"kgVqctZTU"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1977","Name":"uLKubUYwK"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1978","Name":"GpnkXvauN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1979","Name":"jedHpevqz"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1980","Name":"IRxPyCaGv"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1981","Name":"IwrIIYLRF"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1982","Name":"MeOEiDmWo"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1983","Name":"VdEslNNyw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1984","Name":"sMIlPjhxE"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1985","Name":"HdHvGPDGP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1986","Name":"zxXiBBFJR"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1987","Name":"xZVKSVuni"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1988","Name":"fgRwyXiBp"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1989","Name":"oPanlIwMX"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1990","Name":"JoOvekwJQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1991","Name":"iTbiBdhqk"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1992","Name":"oFsDFmhwj"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1993","Name":"ACKZuTaMP"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1994","Name":"WajqZuNtO"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1995","Name":"VakJkFTVw"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1996","Name":"rLXyynWrQ"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1997","Name":"wtikYRNUm"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1998","Name":"XlDhHgvrN"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"1999","Name":"MuWaPftbB"},"emitted_at":1673989570000} +{"stream":"Sheet6-2000-rows","data":{"ID":"2000","Name":"GbAmLYPih"},"emitted_at":1673989570000} diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index ca6d3de073bfa..8a78befd360e9 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -51,6 +51,8 @@ dynamic_streams: error_handler: type: CustomErrorHandler class_name: source_google_sheets.components.SheetDataErrorHandler + backoff_strategies: + - type: ExponentialBackoffStrategy response_filters: $ref: "#/definitions/response_filters/response_error_filters" schema_loader: @@ -85,6 +87,8 @@ dynamic_streams: type: CompositeErrorHandler error_handlers: - type: DefaultErrorHandler + backoff_strategies: + - type: ExponentialBackoffStrategy response_filters: $ref: "#/definitions/response_filters/single_sheet_response_error_filters" schema_type_identifier: @@ -163,6 +167,8 @@ definitions: type: CompositeErrorHandler error_handlers: - type: DefaultErrorHandler + backoff_strategies: + - type: ExponentialBackoffStrategy response_filters: $ref: "#/definitions/response_filters/response_error_filters" record_selector: @@ -298,7 +304,7 @@ definitions: Please ensure the Spreadsheet Link you have set is valid and the spreadsheet exists. If the issue persists, contact support rate_limit: type: HttpResponseFilter - action: RETRY + action: RATE_LIMITED http_codes: - 429 error_message: >- From 17d778107c0fd828109b327534f3a824421859a4 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 22:48:48 +0100 Subject: [PATCH 49/63] Speedup conenctor --- .../batch_size_manager.py | 35 ------------------ .../components/__init__.py | 4 +- .../components/error_handlers.py | 21 ----------- .../components/extractors.py | 2 +- .../components/partition_routers.py | 9 ++--- .../components/retrievers.py | 17 --------- .../source_google_sheets/manifest.yaml | 18 ++++++--- .../conftest/google_sheets_base_test.py | 3 -- .../integration/test_exception_description.py | 4 +- .../unit_tests/integration/test_source.py | 37 ------------------- 10 files changed, 20 insertions(+), 130 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py deleted file mode 100644 index fa9d97ba57920..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/batch_size_manager.py +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -import logging -from typing import Optional, Union - -import requests -from requests.status_codes import codes as status_codes - - -logger = logging.getLogger("airbyte") - - -class BatchSizeManager: - _instance = None - RATE_LIMIT_INCREASE = 100 - - def __new__(cls, initial_batch_size=200): - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance.row_batch_size = initial_batch_size - return cls._instance - - def get_batch_size(self) -> int: - return self._instance.row_batch_size - - def increase_row_batch_size(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> None: - if response_or_exception.status_code == status_codes.TOO_MANY_REQUESTS and self._instance.row_batch_size < 1000: - self._instance.row_batch_size += BatchSizeManager.RATE_LIMIT_INCREASE - logger.info(f"Increasing number of records fetching due to rate limits. Current value: {self._instance.row_batch_size}") - - @classmethod - def reset(cls): - cls._instance = None diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py index bd4927d4c8cd5..41c7b4a517859 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/__init__.py @@ -4,7 +4,5 @@ from source_google_sheets.components.extractors import DpathSchemaMatchingExtractor, DpathSchemaExtractor from source_google_sheets.components.partition_routers import RangePartitionRouter -from source_google_sheets.components.error_handlers import SheetDataErrorHandler -from source_google_sheets.components.retrievers import SheetsDataRetriever -__all__ = ["DpathSchemaMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor", "SheetDataErrorHandler", "SheetsDataRetriever"] +__all__ = ["DpathSchemaMatchingExtractor", "RangePartitionRouter", "DpathSchemaExtractor"] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py deleted file mode 100644 index a7b3b2659db60..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/error_handlers.py +++ /dev/null @@ -1,21 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -from dataclasses import dataclass -from typing import Optional, Union - -import requests - -from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler -from airbyte_cdk.sources.streams.http.error_handlers.response_models import ( - ErrorResolution, -) -from source_google_sheets.batch_size_manager import BatchSizeManager - - -@dataclass -class SheetDataErrorHandler(DefaultErrorHandler): - def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> ErrorResolution: - BatchSizeManager().increase_row_batch_size(response_or_exception) - return super().interpret_response(response_or_exception) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 54b8f8d9be72a..77d1362e41b30 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -1,4 +1,4 @@ -# + # # Copyright (c) 2025 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py index 3ff16482a3aaa..bbde9a5c68fdf 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/partition_routers.py @@ -7,7 +7,6 @@ from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter from airbyte_cdk.sources.types import StreamSlice -from source_google_sheets.batch_size_manager import BatchSizeManager logger = logging.getLogger("airbyte") @@ -24,14 +23,14 @@ def __init__(self, parameters: Mapping[str, Any]) -> None: super().__init__(parameters) self.parameters = parameters self.sheet_row_count = parameters.get("row_count", 0) - self._sheet_id = parameters.get("sheet_id") - self.batch_size_manager = BatchSizeManager(parameters.get("batch_size")) + self.sheet_id = parameters.get("sheet_id") + self.batch_size = parameters.get("batch_size") def stream_slices(self) -> Iterable[StreamSlice]: start_range = 2 # skip 1 row, as expected column (fields) names there while start_range <= self.sheet_row_count: - end_range = start_range + self.batch_size_manager.get_batch_size() - logger.info(f"Fetching range {self._sheet_id}!{start_range}:{end_range}") + end_range = start_range + self.batch_size + logger.info(f"Fetching range {self.sheet_id}!{start_range}:{end_range}") yield StreamSlice(partition={"start_range": start_range, "end_range": end_range}, cursor_slice={}) start_range = end_range + 1 diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py deleted file mode 100644 index 0ce8702a7087d..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/retrievers.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -from dataclasses import dataclass -from typing import Any, Mapping - -from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever -from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer -from source_google_sheets.components import RangePartitionRouter - - -@dataclass -class SheetsDataRetriever(SimpleRetriever): - def __post_init__(self, parameters: Mapping[str, Any]) -> None: - super().__post_init__(parameters) - self.stream_slicer: StreamSlicer = RangePartitionRouter(parameters=parameters) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 8a78befd360e9..891530f3b7fd7 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -12,14 +12,18 @@ dynamic_streams: stream_template: type: DeclarativeStream name: "" + $parameters: + i: 123 primary_key: [] retriever: - type: CustomRetriever - class_name: "source_google_sheets.components.SheetsDataRetriever" + type: SimpleRetriever $parameters: row_count: 0 sheet_id: "" batch_size: 0 + partition_router: + type: CustomPartitionRouter + class_name: "source_google_sheets.components.partition_routers.RangePartitionRouter" paginator: type: NoPagination record_selector: @@ -49,8 +53,7 @@ dynamic_streams: path: >- {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json error_handler: - type: CustomErrorHandler - class_name: source_google_sheets.components.SheetDataErrorHandler + type: DefaultErrorHandler backoff_strategies: - type: ExponentialBackoffStrategy response_filters: @@ -132,12 +135,14 @@ dynamic_streams: description: indexed_schema to match with row values. - field_path: - retriever + - partition_router - $parameters - row_count type: ComponentMappingDefinition value: "{{components_values['properties']['gridProperties']['rowCount']}}" - field_path: - retriever + - partition_router - $parameters - sheet_id type: ComponentMappingDefinition @@ -145,10 +150,11 @@ dynamic_streams: description: sheet_id for retriever. - field_path: - retriever + - partition_router - $parameters - batch_size type: ComponentMappingDefinition - value: "{{config.get('batch_size', 200)}}" + value: "{{config.get('batch_size', 1000000)}}" description: batch size count for dynamic stream partition router (slicer). definitions: @@ -189,6 +195,7 @@ definitions: base_requester: type: HttpRequester url_base: https://sheets.googleapis.com/v4/spreadsheets/ + use_cache: true authenticator: "#/definitions/authenticator" retrievers: components_resolver_retriever: @@ -221,7 +228,6 @@ definitions: - type: DefaultErrorHandler response_filters: $ref: "#/definitions/response_filters/single_sheet_response_error_filters" - response_filters: expected_one_sheet: type: HttpResponseFilter diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py index 7fa49959d2e87..4b620d9a2b56d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/google_sheets_base_test.py @@ -8,8 +8,6 @@ from typing import Any, Dict, List, Optional, Tuple, Union from unittest import TestCase -from source_google_sheets.batch_size_manager import BatchSizeManager - from airbyte_cdk.models import ( ConfiguredAirbyteCatalog, ) @@ -35,7 +33,6 @@ class GoogleSheetsBaseTest(TestCase, ABC): def setUp(self) -> None: self._config = deepcopy(_CONFIG) self._service_config = deepcopy(_SERVICE_CONFIG) - BatchSizeManager.reset() @staticmethod def _check(config: Dict[str, Any], expecting_exception: bool = True) -> EntrypointOutput: diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py index a5dc098aa678a..b598d06a8f677 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_exception_description.py @@ -43,7 +43,7 @@ def exception_description_by_status_code(code: int, spreadsheet_id) -> str: ) if code == status_codes.TOO_MANY_REQUESTS: - return "Rate limit has been reached. Please try later or request a higher quota for your account." + return "Exception while syncing stream a_stream_name: Rate limit has been reached. Please try later or request a higher quota for your account." return "" @@ -213,5 +213,5 @@ def test_read_500_error(self, http_mocker: HttpMocker) -> None: with patch("time.sleep"): output = self._read(self._config, catalog=configured_catalog, expecting_exception=True) - expected_message = f"{exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID)}" + expected_message = f"Exception while syncing stream a_stream_name: {exception_description_by_status_code(status_codes.INTERNAL_SERVER_ERROR, _SPREADSHEET_ID)}" assert output.errors[0].trace.error.internal_message == expected_message diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py index 7d900416385e6..74fc489b97d71 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/test_source.py @@ -483,43 +483,6 @@ def test_when_read_by_batches_make_expected_requests(self, http_mocker: HttpMock output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) assert len(output.records) > 0 - @HttpMocker() - def test_when_read_receives_429_and_increases_batch_size(self, http_mocker: HttpMocker) -> None: - test_file_base_name = "read_by_batches" - stream_name = "d_stream_name" - initial_batch_size = 10 - incremental_batch_size = initial_batch_size - GoogleSheetsBaseTest.get_spreadsheet_info_and_sheets(http_mocker, f"{test_file_base_name}_{GET_SPREADSHEET_INFO}_2") - GoogleSheetsBaseTest.get_sheet_first_row(http_mocker, f"{test_file_base_name}_{GET_SHEETS_FIRST_ROW}_2", stream_name=stream_name) - start_range = 2 - too_many_response_increase = 100 - for range_file_postfix in ("first_batch", "second_batch", "third_batch", "fourth_batch", "fifth_batch"): - end_range = start_range + incremental_batch_size - request_range = (start_range, end_range) - mocked_responses = [ - HttpResponse(json.dumps(find_template("rate_limit_error", __file__)), status_codes.TOO_MANY_REQUESTS), - HttpResponse( - json.dumps(find_template(f"{test_file_base_name}_{GET_STREAM_DATA}_{range_file_postfix}", __file__)), status_codes.OK - ), - ] - GoogleSheetsBaseTest.get_stream_data( - http_mocker, request_range=request_range, responses=mocked_responses, stream_name=stream_name - ) - # after every 429 response we increase by 100 the batch size - incremental_batch_size += too_many_response_increase - start_range = end_range + 1 - catalog_properties = {} - for expected_property in ["id", "name", "normalized_name"]: - catalog_properties[expected_property] = {"type": ["null", "string"]} - configured_catalog = ( - CatalogBuilder() - .with_stream(ConfiguredAirbyteStreamBuilder().with_name(stream_name).with_json_schema({"properties": catalog_properties})) - .build() - ) - self._config["batch_size"] = initial_batch_size - output = self._read(self._config, catalog=configured_catalog, expecting_exception=False) - assert len(output.records) > 0 - @HttpMocker() def test_when_read_then_return_records_with_name_conversion(self, http_mocker: HttpMocker) -> None: # will convert '1 тест' to '_1_test and 'header2' to 'header_2' From 23c494da67523c95831006de89fadb9463fb14e2 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Wed, 29 Jan 2025 21:51:17 +0000 Subject: [PATCH 50/63] chore: auto-fix lint and format issues --- .../source_google_sheets/components/extractors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py index 77d1362e41b30..54b8f8d9be72a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/components/extractors.py @@ -1,4 +1,4 @@ - # +# # Copyright (c) 2025 Airbyte, Inc., all rights reserved. # From 37724b873bc235b83a1bd1f2899056b39522e6a0 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Wed, 29 Jan 2025 23:26:38 +0100 Subject: [PATCH 51/63] Remove unnecessary imports --- .../integration/conftest/__init__.py | 23 ++---- .../conftest/custom_http_mocker.py | 78 ------------------- 2 files changed, 5 insertions(+), 96 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py index 940165e5350ef..feb1624ff835c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py +++ b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/__init__.py @@ -2,32 +2,19 @@ # Copyright (c) 2025 Airbyte, Inc., all rights reserved. # -from .custom_http_mocker import parse_and_transform, CustomHttpMocker -from .entrypoint_wrapper_helper import check from .google_sheets_base_test import GoogleSheetsBaseTest -from .mock_credentials import test_private_key, AUTH_BODY, service_account_info, service_account_info_encoded, service_account_credentials, oauth_credentials -from .protocol_helpers import catalog_helper, check_helper, discover_helper, read_helper -from .request_builder import GOOGLE_SHEETS_BASE_URL, OAUTH_AUTHORIZATION_ENDPOINT, RequestBuilder, AuthBuilder +from .mock_credentials import AUTH_BODY, service_account_info, service_account_credentials, oauth_credentials +from .protocol_helpers import check_helper, catalog_helper +from .request_builder import AuthBuilder __all__ = [ - "parse_and_transform", - "CustomHttpMocker", - "check", + "AUTH_BODY", + "AuthBuilder", "GoogleSheetsBaseTest", - "test_private_key", "service_account_info", - "AUTH_BODY", - "service_account_info_encoded", "service_account_credentials", "oauth_credentials", "catalog_helper", "check_helper", - "discover_helper", - "read_helper", - "GOOGLE_SHEETS_BASE_URL", - "OAUTH_AUTHORIZATION_ENDPOINT", - "RequestBuilder", - "AuthBuilder", - ] diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py deleted file mode 100644 index 5a9ed9c241338..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/integration/conftest/custom_http_mocker.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -from functools import wraps -from typing import Dict -from unittest.mock import patch -from urllib.parse import unquote, urlunparse - -from httplib2 import Response - -from airbyte_cdk.test.mock_http import HttpResponse -from airbyte_cdk.test.mock_http.request import HttpRequest - - -def parse_and_transform(parse_result_str: str): - """ - Parse the input string representation of a HttpRequest transform it into the URL. - """ - parse_result_part = parse_result_str.split("ParseResult(", 1)[1].split(")", 1)[0] - - # Convert the ParseResult string into a dictionary - components = eval(f"dict({parse_result_part})") - - url = urlunparse( - ( - components["scheme"], - components["netloc"], - components["path"], - components["params"], - components["query"], - components["fragment"], - ) - ) - - return url - - -class CustomHttpMocker: - """ - This is a limited mocker for usage with httplib2.Http.request - It has a similar interface to airbyte HttpMocker such than when we move this connector to low-code only with - a http retriever we will be able to substitute CustomHttpMocker => HttpMocker in out integration testing with minimal changes. - - Note: there is only support for get and post method and url matching ignoring the body but this is enough for the current test set. - """ - - requests_mapper: Dict = {} - - def post(self, request: HttpRequest, response: HttpResponse): - custom_response = (Response({"status": response.status_code}), response.body.encode("utf-8")) - uri = parse_and_transform(str(request)) - decoded_url = unquote(uri) - self.requests_mapper[("POST", decoded_url)] = custom_response - - def get(self, request: HttpRequest, response: HttpResponse): - custom_response = (Response({"status": response.status_code}), response.body.encode("utf-8")) - uri = parse_and_transform(str(request)) - decoded_url = unquote(uri) - self.requests_mapper[("GET", decoded_url)] = custom_response - - def mock_request(self, uri, method="GET", body=None, headers=None, **kwargs): - decoded_url = unquote(uri) - mocked_response = self.requests_mapper.get((method, decoded_url)) - if not mocked_response: - raise Exception(f"Mock response not found {uri} {method}") - return mocked_response - - # trying to type that using callables provides the error `incompatible with return type "_F" in supertype "ContextDecorator"` - def __call__(self, test_func): # type: ignore - @wraps(test_func) - def wrapper(*args, **kwargs): # type: ignore # this is a very generic wrapper that does not need to be typed - kwargs["http_mocker"] = self - - with patch("httplib2.Http.request", side_effect=self.mock_request): - return test_func(*args, **kwargs) - - return wrapper From 46981a14033be0945e3df07775443ecc5f478151 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 00:13:54 +0100 Subject: [PATCH 52/63] Add coverage ignore file --- .../connectors/source-google-sheets/.coveragerc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 airbyte-integrations/connectors/source-google-sheets/.coveragerc diff --git a/airbyte-integrations/connectors/source-google-sheets/.coveragerc b/airbyte-integrations/connectors/source-google-sheets/.coveragerc new file mode 100644 index 0000000000000..e12620e432df6 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-sheets/.coveragerc @@ -0,0 +1,3 @@ +[run] +omit = + source_google_sheets/run.py \ No newline at end of file From caafa61c12482a9f9423573709a8065e17b3a2b3 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 01:41:06 +0100 Subject: [PATCH 53/63] disable http proxy --- airbyte-ci/connectors/live-tests/src/live_tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py b/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py index 5e3256b84a78b..c14bedcab7999 100644 --- a/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py +++ b/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py @@ -494,7 +494,7 @@ async def run_command( dagger_client, execution_inputs, runs_in_ci, - http_proxy=proxy, + # http_proxy=proxy, ) execution_result = await runner.run() return execution_result, proxy From 8996ce3470792330bcde8030766066b49a1d2c33 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 02:19:56 +0100 Subject: [PATCH 54/63] rollback http proxy --- airbyte-ci/connectors/live-tests/src/live_tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py b/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py index c14bedcab7999..5e3256b84a78b 100644 --- a/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py +++ b/airbyte-ci/connectors/live-tests/src/live_tests/conftest.py @@ -494,7 +494,7 @@ async def run_command( dagger_client, execution_inputs, runs_in_ci, - # http_proxy=proxy, + http_proxy=proxy, ) execution_result = await runner.run() return execution_result, proxy From 0b684e39315d2eae9a5ce628e18d54cce67c573a Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 02:29:51 +0100 Subject: [PATCH 55/63] Update docs and add rc version --- .../source-google-sheets/metadata.yaml | 2 +- .../source_google_sheets/spec.yaml | 10 +- docs/integrations/sources/google-sheets.md | 168 +++++++++--------- 3 files changed, 88 insertions(+), 92 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index 797b8b8aecf32..2c245e15abc7f 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -10,7 +10,7 @@ data: connectorSubtype: file connectorType: source definitionId: 71607ba1-c0ac-4799-8049-7f4b90dd50f7 - dockerImageTag: 0.9.0 + dockerImageTag: 0.9.0-rc.1 dockerRepository: airbyte/source-google-sheets documentationUrl: https://docs.airbyte.com/integrations/sources/google-sheets githubIssueLabel: source-google-sheets diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/spec.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/spec.yaml index af52bc87a1260..a0ba54a3b7ca1 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/spec.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/spec.yaml @@ -12,17 +12,15 @@ connectionSpecification: type: integer title: Row Batch Size description: >- - Default value is 200. + Default value is 1000000. An integer representing row batch size for each sent request to Google Sheets API. - Row batch size means how many rows are processed from the google sheet, for example default value 200 - would process rows 1-201, then 201-401 and so on. + Row batch size means how many rows are processed from the google sheet, for example default value 1000000 + would process rows 2-1000002, then 1000003-2000003 and so on. Based on Google Sheets API limits documentation, it is possible to send up to 300 requests per minute, but each individual request has to be processed under 180 seconds, otherwise the request returns a timeout error. In regards to this information, consider network speed and number of columns of the google sheet when deciding a batch_size value. - Default value should cover most of the cases, but if a google sheet has over 100,000 records or more, - consider increasing batch_size value. - default: 200 + default: 1000000 spreadsheet_id: type: string title: Spreadsheet Link diff --git a/docs/integrations/sources/google-sheets.md b/docs/integrations/sources/google-sheets.md index 3f0391c0ea4fe..5d5e45cc97816 100644 --- a/docs/integrations/sources/google-sheets.md +++ b/docs/integrations/sources/google-sheets.md @@ -114,16 +114,14 @@ If your spreadsheet is viewable by anyone with its link, no further action is ne 6. For **Spreadsheet Link**, enter the link to the Google spreadsheet. To get the link, go to the Google spreadsheet you want to sync, click **Share** in the top right corner, and click **Copy Link**. -7. For **Batch Size**, enter an integer which represents batch size when processing a Google Sheet. Default value is 200. +7. For **Batch Size**, enter an integer which represents batch size when processing a Google Sheet. Default value is 1000000. Batch size is an integer representing row batch size for each sent request to Google Sheets API. - Row batch size means how many rows are processed from the google sheet, for example default value 200 - would process rows 1-201, then 201-401 and so on. + Row batch size means how many rows are processed from the google sheet, for example default value 1000000 + would process rows 2-1000002, then 1000003-2000003 and so on. Based on [Google Sheets API limits documentation](https://developers.google.com/sheets/api/limits), it is possible to send up to 300 requests per minute, but each individual request has to be processed under 180 seconds, otherwise the request returns a timeout error. In regards to this information, consider network speed and number of columns of the google sheet when deciding a batch_size value. - Default value should cover most of the cases, but if a google sheet has over 100,000 records or more, - consider increasing batch_size value. 8. (Optional) You may enable the option to **Convert Column Names to SQL-Compliant Format**. Enabling this option will allow the connector to convert column names to a standardized, SQL-friendly format. For example, a column name of `Café Earnings 2022` will be converted to `cafe_earnings_2022`. We recommend enabling this option if your target destination is SQL-based (ie Postgres, MySQL). Set to false by default. @@ -151,7 +149,7 @@ Each sheet in the selected spreadsheet is synced as a separate stream. Each sele Airbyte only supports replicating [Grid](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetType) sheets. | Integration Type | Airbyte Type | Notes | -| :--------------- | :----------- | :---- | +|:-----------------|:-------------|:------| | any type | `string` | | ## Limitations & Troubleshooting @@ -187,84 +185,84 @@ Airbyte batches requests to the API in order to efficiently pull data and respec
Expand to review -| Version | Date | Pull Request | Subject | -|---------|------------|----------------------------------------------------------|-----------------------------------------------------------------------------------| -| 0.9.0 | 2025-01-27 | [50843](https://github.com/airbytehq/airbyte/pull/50843) | Migrate low code | -| 0.8.5 | 2025-01-11 | [44270](https://github.com/airbytehq/airbyte/pull/44270) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | -| 0.8.4 | 2024-12-09 | [48835](https://github.com/airbytehq/airbyte/pull/48835) | Implementing integration tests | -| 0.7.4 | 2024-09-09 | [45108](https://github.com/airbytehq/airbyte/pull/45108) | Google Sheets API errors now cause syncs to fail | -| 0.7.3 | 2024-08-12 | [43921](https://github.com/airbytehq/airbyte/pull/43921) | Update dependencies | -| 0.7.2 | 2024-08-10 | [43544](https://github.com/airbytehq/airbyte/pull/43544) | Update dependencies | -| 0.7.1 | 2024-08-03 | [43290](https://github.com/airbytehq/airbyte/pull/43290) | Update dependencies | -| 0.7.0 | 2024-08-02 | [42975](https://github.com/airbytehq/airbyte/pull/42975) | Migrate to CDK v4.3.0 | -| 0.6.3 | 2024-07-27 | [42826](https://github.com/airbytehq/airbyte/pull/42826) | Update dependencies | -| 0.6.2 | 2024-07-22 | [41993](https://github.com/airbytehq/airbyte/pull/41993) | Avoid syncs with rate limits being considered successful | -| 0.6.1 | 2024-07-20 | [42376](https://github.com/airbytehq/airbyte/pull/42376) | Update dependencies | -| 0.6.0 | 2024-07-17 | [42071](https://github.com/airbytehq/airbyte/pull/42071) | Migrate to CDK v3.9.0 | -| 0.5.11 | 2024-07-13 | [41527](https://github.com/airbytehq/airbyte/pull/41527) | Update dependencies | -| 0.5.10 | 2024-07-09 | [41273](https://github.com/airbytehq/airbyte/pull/41273) | Update dependencies | -| 0.5.9 | 2024-07-06 | [41005](https://github.com/airbytehq/airbyte/pull/41005) | Update dependencies | -| 0.5.8 | 2024-06-28 | [40587](https://github.com/airbytehq/airbyte/pull/40587) | Replaced deprecated AirbyteLogger with logging.Logger | -| 0.5.7 | 2024-06-25 | [40560](https://github.com/airbytehq/airbyte/pull/40560) | Catch an auth error during discover and raise a config error | -| 0.5.6 | 2024-06-26 | [40533](https://github.com/airbytehq/airbyte/pull/40533) | Update dependencies | -| 0.5.5 | 2024-06-25 | [40505](https://github.com/airbytehq/airbyte/pull/40505) | Update dependencies | -| 0.5.4 | 2024-06-22 | [40129](https://github.com/airbytehq/airbyte/pull/40129) | Update dependencies | -| 0.5.3 | 2024-06-06 | [39225](https://github.com/airbytehq/airbyte/pull/39225) | [autopull] Upgrade base image to v1.2.2 | -| 0.5.2 | 2024-06-02 | [38851](https://github.com/airbytehq/airbyte/pull/38851) | Emit state message at least once per stream | -| 0.5.1 | 2024-04-11 | [35404](https://github.com/airbytehq/airbyte/pull/35404) | Add `row_batch_size` parameter more granular control read records | -| 0.5.0 | 2024-03-26 | [36515](https://github.com/airbytehq/airbyte/pull/36515) | Resolve poetry dependency conflict, add record counts to state messages | -| 0.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | -| 0.3.17 | 2024-02-29 | [35722](https://github.com/airbytehq/airbyte/pull/35722) | Add logic to emit stream statuses | -| 0.3.16 | 2024-02-12 | [35136](https://github.com/airbytehq/airbyte/pull/35136) | Fix license in `pyproject.toml`. | -| 0.3.15 | 2024-02-07 | [34944](https://github.com/airbytehq/airbyte/pull/34944) | Manage dependencies with Poetry. | -| 0.3.14 | 2024-01-23 | [34437](https://github.com/airbytehq/airbyte/pull/34437) | Fix header cells filtering | -| 0.3.13 | 2024-01-19 | [34376](https://github.com/airbytehq/airbyte/pull/34376) | Fix names conversion | -| 0.3.12 | 2023-12-14 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib | -| 0.3.11 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | -| 0.3.10 | 2023-09-27 | [30487](https://github.com/airbytehq/airbyte/pull/30487) | Fix bug causing rows to be skipped when batch size increased due to rate limits. | -| 0.3.9 | 2023-09-25 | [30749](https://github.com/airbytehq/airbyte/pull/30749) | Performance testing - include socat binary in docker image | -| 0.3.8 | 2023-09-25 | [30747](https://github.com/airbytehq/airbyte/pull/30747) | Performance testing - include socat binary in docker image | -| 0.3.7 | 2023-08-25 | [29826](https://github.com/airbytehq/airbyte/pull/29826) | Remove row batch size from spec, add auto increase this value when rate limits | -| 0.3.6 | 2023-08-16 | [29491](https://github.com/airbytehq/airbyte/pull/29491) | Update to latest CDK | -| 0.3.5 | 2023-08-16 | [29427](https://github.com/airbytehq/airbyte/pull/29427) | Add stop reading in case of 429 error | -| 0.3.4 | 2023-05-15 | [29453](https://github.com/airbytehq/airbyte/pull/29453) | Update spec descriptions | -| 0.3.3 | 2023-08-10 | [29327](https://github.com/airbytehq/airbyte/pull/29327) | Add user-friendly error message for 404 and 403 error while discover | -| 0.3.2 | 2023-08-09 | [29246](https://github.com/airbytehq/airbyte/pull/29246) | Add checking while reading to skip modified sheets | -| 0.3.1 | 2023-07-06 | [28033](https://github.com/airbytehq/airbyte/pull/28033) | Fixed several reported vulnerabilities (25 total), CVE-2022-37434, CVE-2022-42898 | -| 0.3.0 | 2023-06-26 | [27738](https://github.com/airbytehq/airbyte/pull/27738) | License Update: Elv2 | -| 0.2.39 | 2023-05-31 | [26833](https://github.com/airbytehq/airbyte/pull/26833) | Remove authSpecification in favour of advancedAuth in specification | -| 0.2.38 | 2023-05-16 | [26097](https://github.com/airbytehq/airbyte/pull/26097) | Refactor config error | -| 0.2.37 | 2023-02-21 | [23292](https://github.com/airbytehq/airbyte/pull/23292) | Skip non grid sheets. | -| 0.2.36 | 2023-02-21 | [23272](https://github.com/airbytehq/airbyte/pull/23272) | Handle empty sheets gracefully. | -| 0.2.35 | 2023-02-23 | [23057](https://github.com/airbytehq/airbyte/pull/23057) | Slugify column names | -| 0.2.34 | 2023-02-15 | [23071](https://github.com/airbytehq/airbyte/pull/23071) | Change min spreadsheet id size to 20 symbols | -| 0.2.33 | 2023-02-13 | [23278](https://github.com/airbytehq/airbyte/pull/23278) | Handle authentication errors | -| 0.2.32 | 2023-02-13 | [22884](https://github.com/airbytehq/airbyte/pull/22884) | Do not consume http spreadsheets. | -| 0.2.31 | 2022-10-09 | [19574](https://github.com/airbytehq/airbyte/pull/19574) | Revert 'Add row_id to rows and use as primary key' | -| 0.2.30 | 2022-10-09 | [19215](https://github.com/airbytehq/airbyte/pull/19215) | Add row_id to rows and use as primary key | -| 0.2.21 | 2022-10-04 | [15591](https://github.com/airbytehq/airbyte/pull/15591) | Clean instantiation of AirbyteStream | -| 0.2.20 | 2022-10-10 | [17766](https://github.com/airbytehq/airbyte/pull/17766) | Fix null pointer exception when parsing the spreadsheet id. | -| 0.2.19 | 2022-09-29 | [17410](https://github.com/airbytehq/airbyte/pull/17410) | Use latest CDK. | -| 0.2.18 | 2022-09-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | -| 0.2.17 | 2022-08-03 | [15107](https://github.com/airbytehq/airbyte/pull/15107) | Expose Row Batch Size in Connector Specification | -| 0.2.16 | 2022-07-07 | [13729](https://github.com/airbytehq/airbyte/pull/13729) | Improve configuration field description | -| 0.2.15 | 2022-06-02 | [13446](https://github.com/airbytehq/airbyte/pull/13446) | Retry requests resulting in a server error | -| 0.2.13 | 2022-05-06 | [12685](https://github.com/airbytehq/airbyte/pull/12685) | Update CDK to v0.1.56 to emit an `AirbyeTraceMessage` on uncaught exceptions | -| 0.2.12 | 2022-04-20 | [12230](https://github.com/airbytehq/airbyte/pull/12230) | Update connector to use a `spec.yaml` | -| 0.2.11 | 2022-04-13 | [11977](https://github.com/airbytehq/airbyte/pull/11977) | Replace leftover print statement with airbyte logger | -| 0.2.10 | 2022-03-25 | [11404](https://github.com/airbytehq/airbyte/pull/11404) | Allow using Spreadsheet Link/URL instead of Spreadsheet ID | -| 0.2.9 | 2022-01-25 | [9208](https://github.com/airbytehq/airbyte/pull/9208) | Update title and descriptions | -| 0.2.7 | 2021-09-27 | [8470](https://github.com/airbytehq/airbyte/pull/8470) | Migrate to the CDK | -| 0.2.6 | 2021-09-27 | [6354](https://github.com/airbytehq/airbyte/pull/6354) | Support connecting via Oauth webflow | -| 0.2.5 | 2021-09-12 | [5972](https://github.com/airbytehq/airbyte/pull/5972) | Fix full_refresh test by adding supported_sync_modes to Stream initialization | -| 0.2.4 | 2021-08-05 | [5233](https://github.com/airbytehq/airbyte/pull/5233) | Fix error during listing sheets with diagram only | -| 0.2.3 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add AIRBYTE_ENTRYPOINT for Kubernetes support | -| 0.2.2 | 2021-04-20 | [2994](https://github.com/airbytehq/airbyte/pull/2994) | Formatting spec | -| 0.2.1 | 2021-04-03 | [2726](https://github.com/airbytehq/airbyte/pull/2726) | Fix base connector versioning | -| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | -| 0.1.7 | 2021-01-21 | [1762](https://github.com/airbytehq/airbyte/pull/1762) | Fix issue large spreadsheet | -| 0.1.6 | 2021-01-27 | [1668](https://github.com/airbytehq/airbyte/pull/1668) | Adopt connector best practices | -| 0.1.5 | 2020-12-30 | [1438](https://github.com/airbytehq/airbyte/pull/1438) | Implement backoff | -| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | +| Version | Date | Pull Request | Subject | +|------------|------------|----------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.9.0-rc.1 | 2025-02-03 | [50843](https://github.com/airbytehq/airbyte/pull/50843) | Migrate to low-code | +| 0.8.5 | 2025-01-11 | [44270](https://github.com/airbytehq/airbyte/pull/44270) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | +| 0.8.4 | 2024-12-09 | [48835](https://github.com/airbytehq/airbyte/pull/48835) | Implementing integration tests | +| 0.7.4 | 2024-09-09 | [45108](https://github.com/airbytehq/airbyte/pull/45108) | Google Sheets API errors now cause syncs to fail | +| 0.7.3 | 2024-08-12 | [43921](https://github.com/airbytehq/airbyte/pull/43921) | Update dependencies | +| 0.7.2 | 2024-08-10 | [43544](https://github.com/airbytehq/airbyte/pull/43544) | Update dependencies | +| 0.7.1 | 2024-08-03 | [43290](https://github.com/airbytehq/airbyte/pull/43290) | Update dependencies | +| 0.7.0 | 2024-08-02 | [42975](https://github.com/airbytehq/airbyte/pull/42975) | Migrate to CDK v4.3.0 | +| 0.6.3 | 2024-07-27 | [42826](https://github.com/airbytehq/airbyte/pull/42826) | Update dependencies | +| 0.6.2 | 2024-07-22 | [41993](https://github.com/airbytehq/airbyte/pull/41993) | Avoid syncs with rate limits being considered successful | +| 0.6.1 | 2024-07-20 | [42376](https://github.com/airbytehq/airbyte/pull/42376) | Update dependencies | +| 0.6.0 | 2024-07-17 | [42071](https://github.com/airbytehq/airbyte/pull/42071) | Migrate to CDK v3.9.0 | +| 0.5.11 | 2024-07-13 | [41527](https://github.com/airbytehq/airbyte/pull/41527) | Update dependencies | +| 0.5.10 | 2024-07-09 | [41273](https://github.com/airbytehq/airbyte/pull/41273) | Update dependencies | +| 0.5.9 | 2024-07-06 | [41005](https://github.com/airbytehq/airbyte/pull/41005) | Update dependencies | +| 0.5.8 | 2024-06-28 | [40587](https://github.com/airbytehq/airbyte/pull/40587) | Replaced deprecated AirbyteLogger with logging.Logger | +| 0.5.7 | 2024-06-25 | [40560](https://github.com/airbytehq/airbyte/pull/40560) | Catch an auth error during discover and raise a config error | +| 0.5.6 | 2024-06-26 | [40533](https://github.com/airbytehq/airbyte/pull/40533) | Update dependencies | +| 0.5.5 | 2024-06-25 | [40505](https://github.com/airbytehq/airbyte/pull/40505) | Update dependencies | +| 0.5.4 | 2024-06-22 | [40129](https://github.com/airbytehq/airbyte/pull/40129) | Update dependencies | +| 0.5.3 | 2024-06-06 | [39225](https://github.com/airbytehq/airbyte/pull/39225) | [autopull] Upgrade base image to v1.2.2 | +| 0.5.2 | 2024-06-02 | [38851](https://github.com/airbytehq/airbyte/pull/38851) | Emit state message at least once per stream | +| 0.5.1 | 2024-04-11 | [35404](https://github.com/airbytehq/airbyte/pull/35404) | Add `row_batch_size` parameter more granular control read records | +| 0.5.0 | 2024-03-26 | [36515](https://github.com/airbytehq/airbyte/pull/36515) | Resolve poetry dependency conflict, add record counts to state messages | +| 0.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | +| 0.3.17 | 2024-02-29 | [35722](https://github.com/airbytehq/airbyte/pull/35722) | Add logic to emit stream statuses | +| 0.3.16 | 2024-02-12 | [35136](https://github.com/airbytehq/airbyte/pull/35136) | Fix license in `pyproject.toml`. | +| 0.3.15 | 2024-02-07 | [34944](https://github.com/airbytehq/airbyte/pull/34944) | Manage dependencies with Poetry. | +| 0.3.14 | 2024-01-23 | [34437](https://github.com/airbytehq/airbyte/pull/34437) | Fix header cells filtering | +| 0.3.13 | 2024-01-19 | [34376](https://github.com/airbytehq/airbyte/pull/34376) | Fix names conversion | +| 0.3.12 | 2023-12-14 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib | +| 0.3.11 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | +| 0.3.10 | 2023-09-27 | [30487](https://github.com/airbytehq/airbyte/pull/30487) | Fix bug causing rows to be skipped when batch size increased due to rate limits. | +| 0.3.9 | 2023-09-25 | [30749](https://github.com/airbytehq/airbyte/pull/30749) | Performance testing - include socat binary in docker image | +| 0.3.8 | 2023-09-25 | [30747](https://github.com/airbytehq/airbyte/pull/30747) | Performance testing - include socat binary in docker image | +| 0.3.7 | 2023-08-25 | [29826](https://github.com/airbytehq/airbyte/pull/29826) | Remove row batch size from spec, add auto increase this value when rate limits | +| 0.3.6 | 2023-08-16 | [29491](https://github.com/airbytehq/airbyte/pull/29491) | Update to latest CDK | +| 0.3.5 | 2023-08-16 | [29427](https://github.com/airbytehq/airbyte/pull/29427) | Add stop reading in case of 429 error | +| 0.3.4 | 2023-05-15 | [29453](https://github.com/airbytehq/airbyte/pull/29453) | Update spec descriptions | +| 0.3.3 | 2023-08-10 | [29327](https://github.com/airbytehq/airbyte/pull/29327) | Add user-friendly error message for 404 and 403 error while discover | +| 0.3.2 | 2023-08-09 | [29246](https://github.com/airbytehq/airbyte/pull/29246) | Add checking while reading to skip modified sheets | +| 0.3.1 | 2023-07-06 | [28033](https://github.com/airbytehq/airbyte/pull/28033) | Fixed several reported vulnerabilities (25 total), CVE-2022-37434, CVE-2022-42898 | +| 0.3.0 | 2023-06-26 | [27738](https://github.com/airbytehq/airbyte/pull/27738) | License Update: Elv2 | +| 0.2.39 | 2023-05-31 | [26833](https://github.com/airbytehq/airbyte/pull/26833) | Remove authSpecification in favour of advancedAuth in specification | +| 0.2.38 | 2023-05-16 | [26097](https://github.com/airbytehq/airbyte/pull/26097) | Refactor config error | +| 0.2.37 | 2023-02-21 | [23292](https://github.com/airbytehq/airbyte/pull/23292) | Skip non grid sheets. | +| 0.2.36 | 2023-02-21 | [23272](https://github.com/airbytehq/airbyte/pull/23272) | Handle empty sheets gracefully. | +| 0.2.35 | 2023-02-23 | [23057](https://github.com/airbytehq/airbyte/pull/23057) | Slugify column names | +| 0.2.34 | 2023-02-15 | [23071](https://github.com/airbytehq/airbyte/pull/23071) | Change min spreadsheet id size to 20 symbols | +| 0.2.33 | 2023-02-13 | [23278](https://github.com/airbytehq/airbyte/pull/23278) | Handle authentication errors | +| 0.2.32 | 2023-02-13 | [22884](https://github.com/airbytehq/airbyte/pull/22884) | Do not consume http spreadsheets. | +| 0.2.31 | 2022-10-09 | [19574](https://github.com/airbytehq/airbyte/pull/19574) | Revert 'Add row_id to rows and use as primary key' | +| 0.2.30 | 2022-10-09 | [19215](https://github.com/airbytehq/airbyte/pull/19215) | Add row_id to rows and use as primary key | +| 0.2.21 | 2022-10-04 | [15591](https://github.com/airbytehq/airbyte/pull/15591) | Clean instantiation of AirbyteStream | +| 0.2.20 | 2022-10-10 | [17766](https://github.com/airbytehq/airbyte/pull/17766) | Fix null pointer exception when parsing the spreadsheet id. | +| 0.2.19 | 2022-09-29 | [17410](https://github.com/airbytehq/airbyte/pull/17410) | Use latest CDK. | +| 0.2.18 | 2022-09-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | +| 0.2.17 | 2022-08-03 | [15107](https://github.com/airbytehq/airbyte/pull/15107) | Expose Row Batch Size in Connector Specification | +| 0.2.16 | 2022-07-07 | [13729](https://github.com/airbytehq/airbyte/pull/13729) | Improve configuration field description | +| 0.2.15 | 2022-06-02 | [13446](https://github.com/airbytehq/airbyte/pull/13446) | Retry requests resulting in a server error | +| 0.2.13 | 2022-05-06 | [12685](https://github.com/airbytehq/airbyte/pull/12685) | Update CDK to v0.1.56 to emit an `AirbyeTraceMessage` on uncaught exceptions | +| 0.2.12 | 2022-04-20 | [12230](https://github.com/airbytehq/airbyte/pull/12230) | Update connector to use a `spec.yaml` | +| 0.2.11 | 2022-04-13 | [11977](https://github.com/airbytehq/airbyte/pull/11977) | Replace leftover print statement with airbyte logger | +| 0.2.10 | 2022-03-25 | [11404](https://github.com/airbytehq/airbyte/pull/11404) | Allow using Spreadsheet Link/URL instead of Spreadsheet ID | +| 0.2.9 | 2022-01-25 | [9208](https://github.com/airbytehq/airbyte/pull/9208) | Update title and descriptions | +| 0.2.7 | 2021-09-27 | [8470](https://github.com/airbytehq/airbyte/pull/8470) | Migrate to the CDK | +| 0.2.6 | 2021-09-27 | [6354](https://github.com/airbytehq/airbyte/pull/6354) | Support connecting via Oauth webflow | +| 0.2.5 | 2021-09-12 | [5972](https://github.com/airbytehq/airbyte/pull/5972) | Fix full_refresh test by adding supported_sync_modes to Stream initialization | +| 0.2.4 | 2021-08-05 | [5233](https://github.com/airbytehq/airbyte/pull/5233) | Fix error during listing sheets with diagram only | +| 0.2.3 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add AIRBYTE_ENTRYPOINT for Kubernetes support | +| 0.2.2 | 2021-04-20 | [2994](https://github.com/airbytehq/airbyte/pull/2994) | Formatting spec | +| 0.2.1 | 2021-04-03 | [2726](https://github.com/airbytehq/airbyte/pull/2726) | Fix base connector versioning | +| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | +| 0.1.7 | 2021-01-21 | [1762](https://github.com/airbytehq/airbyte/pull/1762) | Fix issue large spreadsheet | +| 0.1.6 | 2021-01-27 | [1668](https://github.com/airbytehq/airbyte/pull/1668) | Adopt connector best practices | +| 0.1.5 | 2020-12-30 | [1438](https://github.com/airbytehq/airbyte/pull/1438) | Implement backoff | +| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file |
From de3c0aaf33e1b111db054731e0a9b9edcebe711d Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 13:33:21 +0100 Subject: [PATCH 56/63] Add enableProgressiveRollout to metadata --- .../connectors/source-google-sheets/metadata.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index 2c245e15abc7f..9804875138fce 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -28,6 +28,9 @@ data: oss: enabled: true releaseStage: generally_available + releases: + rolloutConfiguration: + enableProgressiveRollout: true supportLevel: certified tags: - language:python From 5e2ecd23f5d0b7d07c796358e6413e1a952d3fd9 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 14:38:56 +0100 Subject: [PATCH 57/63] Update version in pyproject --- .../connectors/source-google-sheets/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 2a8add6cca3d7..a78c31d9b970d 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "0.9.0" +version = "0.9.0-rc.1" name = "source-google-sheets" description = "Source implementation for Google Sheets." authors = [ "Airbyte ",] From a0093266bc519654e7f26dbd092fe67760a6417e Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 14:47:24 +0100 Subject: [PATCH 58/63] Bump CDK version to latest --- .../connectors/source-google-sheets/poetry.lock | 8 ++++---- .../connectors/source-google-sheets/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index a7ae2f1594f68..ce5854b41f96a 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.29.0.dev0" +version = "6.29.0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.29.0.dev0-py3-none-any.whl", hash = "sha256:6c59ea84b405cb204393da2e024881f76312c181ac225e121b72dbce260fdb10"}, - {file = "airbyte_cdk-6.29.0.dev0.tar.gz", hash = "sha256:a74099d9b958c46a4d0334601232a19ede34c14bafc4d346838c6ab52eb5a8b3"}, + {file = "airbyte_cdk-6.29.0-py3-none-any.whl", hash = "sha256:66d95d7b1309b7c1e2c99f60f8321815e79c248e2bf493d0b68b545ee4474526"}, + {file = "airbyte_cdk-6.29.0.tar.gz", hash = "sha256:cfbdfa00ccaf3388e50bf0aed132a62638caceb3cb8463ff734becd0684bd7ff"}, ] [package.dependencies] @@ -2057,4 +2057,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "ff7451304535a225f3eeb72c919b54d9dfaa516b3a9f1fb1f025c8ac5ea1868d" +content-hash = "1baa7ccbf9f7020611ae36318fb3131415161559fda5020f613589c52b4228b3" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index a78c31d9b970d..0d9eacbe6f03c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = { version = "6.29.0.dev0", allow-prereleases = true } +airbyte-cdk = "^6" [tool.poetry.scripts] source-google-sheets = "source_google_sheets.run:run" From bcec7e9e609f0143c86cdc9fd92e38cacdcaee27 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 19:18:23 +0100 Subject: [PATCH 59/63] Remove config migration --- .../source-google-sheets/poetry.lock | 186 +++++++++--------- .../source-google-sheets/pyproject.toml | 2 +- .../source_google_sheets/config_migrations.py | 82 -------- .../source_google_sheets/manifest.yaml | 6 +- .../source_google_sheets/run.py | 2 - .../config_migration/new_config.json | 8 - .../config_migration/old_config.json | 7 - .../unit_tests/test_config_migration.py | 53 ----- 8 files changed, 97 insertions(+), 249 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json delete mode 100644 airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index ce5854b41f96a..97808cbf5a9f4 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.29.0" +version = "6.30.0.dev0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.29.0-py3-none-any.whl", hash = "sha256:66d95d7b1309b7c1e2c99f60f8321815e79c248e2bf493d0b68b545ee4474526"}, - {file = "airbyte_cdk-6.29.0.tar.gz", hash = "sha256:cfbdfa00ccaf3388e50bf0aed132a62638caceb3cb8463ff734becd0684bd7ff"}, + {file = "airbyte_cdk-6.30.0.dev0-py3-none-any.whl", hash = "sha256:13925480473f3229ede9d7be1d946a8423d8f6c2e6159126b9cef96b82769638"}, + {file = "airbyte_cdk-6.30.0.dev0.tar.gz", hash = "sha256:996a936cdf6e4c69b26b996dd2de9cbc55f39ae08c885b6aaae8c944a2d2ecaf"}, ] [package.dependencies] @@ -1476,99 +1476,99 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.11.0" +version = "3.12.1" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.9" files = [ - {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win32.whl", hash = "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win32.whl", hash = "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win32.whl", hash = "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win32.whl", hash = "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win32.whl", hash = "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424"}, - {file = "rapidfuzz-3.11.0.tar.gz", hash = "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"}, + {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"}, ] [package.extras] @@ -2057,4 +2057,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "1baa7ccbf9f7020611ae36318fb3131415161559fda5020f613589c52b4228b3" +content-hash = "a4ce2b9c5191f1b4b6a2d92bab25f1bbba354156eda27aae47e87dd9cce67ff0" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 0d9eacbe6f03c..12d3acfb1e7e6 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = "^6" +airbyte-cdk = { version = "6.30.0.dev0", allow-prereleases = true } [tool.poetry.scripts] source-google-sheets = "source_google_sheets.run:run" diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py deleted file mode 100644 index 72fdff6fc8114..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/config_migrations.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -import json -from typing import Any, List, Mapping - -import dpath -import orjson - -from airbyte_cdk.config_observation import create_connector_config_control_message -from airbyte_cdk.entrypoint import AirbyteEntrypoint -from airbyte_cdk.models import AirbyteMessageSerializer -from airbyte_cdk.sources.message import InMemoryMessageRepository, MessageRepository -from source_google_sheets import SourceGoogleSheets - - -class MigrateServiceAccountInfo: - """ - Migrates service_account_info to a dict format. - old: - { - "credentials": {"service_account_info": "{ \"some_key\": \"key\" }" - } - new: - { - "credentials": {"service_account": {"some_key": "key"}, "service_account_info": "{ \"some_key\": \"key\" }} - } - """ - - migrate_from_path = ["credentials", "service_account_info"] - migrate_to_path = ["credentials", "service_account"] - - message_repository: MessageRepository = InMemoryMessageRepository() - - @classmethod - def _should_migrate(cls, config: Mapping[str, Any]) -> bool: - service_account_info = dpath.get(config, cls.migrate_from_path, default={}) - if service_account_info and isinstance(service_account_info, str): - return True - return False - - @classmethod - def _migrate_service_account(cls, config: Mapping[str, Any]) -> Mapping[str, Any]: - service_account = json.loads(config["credentials"]["service_account_info"]) - dpath.new(config, cls.migrate_to_path, service_account) - return config - - @classmethod - def _modify_and_save(cls, config_path: str, source: SourceGoogleSheets, config: Mapping[str, Any]) -> Mapping[str, Any]: - # modify the config - migrated_config = cls._migrate_service_account(config) - # save the config - source.write_config(migrated_config, config_path) - # return modified config - return migrated_config - - @classmethod - def _emit_control_message(cls, migrated_config: Mapping[str, Any]) -> None: - # add the Airbyte Control Message to message repo - cls.message_repository.emit_message(create_connector_config_control_message(migrated_config)) - # emit the Airbyte Control Message from message queue to stdout - for message in cls.message_repository._message_queue: - print(orjson.dumps(AirbyteMessageSerializer.dump(message)).decode()) - - @classmethod - def migrate(cls, args: List[str], source: SourceGoogleSheets) -> None: - """ - This method checks the input args, should the config be migrated, - transform if necessary and emit the CONTROL message. - """ - # get config path - config_path = AirbyteEntrypoint(source).extract_config(args) - # proceed only if `--config` arg is provided - if config_path: - # read the existing config - config = source.read_config(config_path) - # migration check - if cls._should_migrate(config): - cls._emit_control_message( - cls._modify_and_save(config_path, source, config), - ) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 891530f3b7fd7..34613500486e0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -334,12 +334,12 @@ definitions: - values jwt_authenticator: type: JwtAuthenticator - secret_key: "{{ config['credentials']['service_account']['private_key'] }}" + secret_key: "{{ json_load(config['credentials']['service_account_info'])['private_key'] }}" algorithm: "RS256" token_duration: 3600 jwt_payload: - aud: "{{ config['credentials']['service_account']['token_uri'] }}" - iss: "{{ config['credentials']['service_account']['client_email'] }}" + aud: "{{ json_load(config['credentials']['service_account_info'])['token_uri'] }}" + iss: "{{ json_load(config['credentials']['service_account_info'])['client_email'] }}" additional_jwt_payload: scope: "https://www.googleapis.com/auth/spreadsheets.readonly https://www.googleapis.com/auth/drive.readonly" oauth_authenticator: diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py index 2a7943c4b08f0..681a9aa43d3cb 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/run.py @@ -12,7 +12,6 @@ from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type -from source_google_sheets.config_migrations import MigrateServiceAccountInfo from source_google_sheets.source import SourceGoogleSheets @@ -50,6 +49,5 @@ def _get_source(args: List[str]): def run(): _args = sys.argv[1:] source = _get_source(_args) - MigrateServiceAccountInfo.migrate(sys.argv[1:], source) if source: launch(source, _args) diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json deleted file mode 100644 index b123be596eb21..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/new_config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "credentials": { - "auth_type": "Service", - "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }", - "service_account": { "type": "service_account", "project_id": "project_id" } - }, - "spreadsheet_id": "spreadsheet_id" -} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json b/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json deleted file mode 100644 index 57285dc6ed382..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/config_migration/old_config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "credentials": { - "auth_type": "Service", - "service_account_info": "{ \"type\": \"service_account\", \"project_id\": \"project_id\" }" - }, - "spreadsheet_id": "spreadsheet_id" -} diff --git a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py b/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py deleted file mode 100644 index d68f73caebf17..0000000000000 --- a/airbyte-integrations/connectors/source-google-sheets/unit_tests/test_config_migration.py +++ /dev/null @@ -1,53 +0,0 @@ -# -# Copyright (c) 2025 Airbyte, Inc., all rights reserved. -# - -import json -import pathlib -from typing import Any, Mapping -from unittest.mock import MagicMock - -import pytest -from source_google_sheets import SourceGoogleSheets -from source_google_sheets.config_migrations import MigrateServiceAccountInfo - -from airbyte_cdk import AirbyteEntrypoint - - -def load_config(path: str) -> Mapping[str, Any]: - with open(path, "r") as f: - return json.load(f) - - -def revert_config(path: str) -> None: - migrated_config = load_config(path) - - del migrated_config["credentials"]["service_account"] - with open(path, "w") as f: - f.write(json.dumps(migrated_config)) - - -@pytest.mark.parametrize( - "config_file_path, run_revert", - [ - (str(pathlib.Path(__file__).parent / "config_migration/old_config.json"), True), - (str(pathlib.Path(__file__).parent / "config_migration/new_config.json"), False), - ], -) -def test_config_migrations(config_file_path, run_revert): - args = ["check", "--config", config_file_path] - source = SourceGoogleSheets( - catalog=MagicMock(), - config=AirbyteEntrypoint.extract_config(args), - state=MagicMock(), - ) - - MigrateServiceAccountInfo().migrate(args, source) - migrated_config = load_config(config_file_path) - - assert "service_account" in migrated_config["credentials"] - assert "service_account_info" in migrated_config["credentials"] - assert isinstance(migrated_config["credentials"]["service_account"], dict) - - if run_revert: - revert_config(config_file_path) From bf1ecac227763385e8207c3a5d2e36ddb35b05af Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 19:55:37 +0100 Subject: [PATCH 60/63] Move to CDK last relese version --- .../connectors/source-google-sheets/poetry.lock | 8 ++++---- .../connectors/source-google-sheets/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index 97808cbf5a9f4..8c351d65c9ea0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.30.0.dev0" +version = "6.30.0" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.30.0.dev0-py3-none-any.whl", hash = "sha256:13925480473f3229ede9d7be1d946a8423d8f6c2e6159126b9cef96b82769638"}, - {file = "airbyte_cdk-6.30.0.dev0.tar.gz", hash = "sha256:996a936cdf6e4c69b26b996dd2de9cbc55f39ae08c885b6aaae8c944a2d2ecaf"}, + {file = "airbyte_cdk-6.30.0-py3-none-any.whl", hash = "sha256:0709d3748e8134562801369f969d3e298b2254c118523c54cc3bca51ddce75ff"}, + {file = "airbyte_cdk-6.30.0.tar.gz", hash = "sha256:82f411df532d1aeb88e5eec2c018e1ae830e5ab3a8bdb0a70be15070159a7b64"}, ] [package.dependencies] @@ -2057,4 +2057,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "a4ce2b9c5191f1b4b6a2d92bab25f1bbba354156eda27aae47e87dd9cce67ff0" +content-hash = "1baa7ccbf9f7020611ae36318fb3131415161559fda5020f613589c52b4228b3" diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 12d3acfb1e7e6..0d9eacbe6f03c 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -17,7 +17,7 @@ include = "source_google_sheets" [tool.poetry.dependencies] python = ">=3.10,<3.13" -airbyte-cdk = { version = "6.30.0.dev0", allow-prereleases = true } +airbyte-cdk = "^6" [tool.poetry.scripts] source-google-sheets = "source_google_sheets.run:run" From b656c05c12f20e4d7218e57d78367142dbfea924 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Thu, 30 Jan 2025 20:29:05 +0100 Subject: [PATCH 61/63] Fix jinja macros --- .../source-google-sheets/source_google_sheets/manifest.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index 34613500486e0..e8868f0938a45 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -334,12 +334,12 @@ definitions: - values jwt_authenticator: type: JwtAuthenticator - secret_key: "{{ json_load(config['credentials']['service_account_info'])['private_key'] }}" + secret_key: "{{ json_loads(config['credentials']['service_account_info'])['private_key'] }}" algorithm: "RS256" token_duration: 3600 jwt_payload: - aud: "{{ json_load(config['credentials']['service_account_info'])['token_uri'] }}" - iss: "{{ json_load(config['credentials']['service_account_info'])['client_email'] }}" + aud: "{{ json_loads(config['credentials']['service_account_info'])['token_uri'] }}" + iss: "{{ json_loads(config['credentials']['service_account_info'])['client_email'] }}" additional_jwt_payload: scope: "https://www.googleapis.com/auth/spreadsheets.readonly https://www.googleapis.com/auth/drive.readonly" oauth_authenticator: From a65f7234aec69cfa9d9c836721527ac2806ea07f Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Fri, 31 Jan 2025 00:57:41 +0100 Subject: [PATCH 62/63] Fix encoding sheet id --- .../integration_tests/configured_catalog.json | 2 +- .../connectors/source-google-sheets/metadata.yaml | 2 +- .../connectors/source-google-sheets/poetry.lock | 6 +++--- .../connectors/source-google-sheets/pyproject.toml | 2 +- .../source-google-sheets/source_google_sheets/manifest.yaml | 6 +++--- docs/integrations/sources/google-sheets.md | 3 ++- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json index 0c287f046d0bc..8a864697740f0 100644 --- a/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-google-sheets/integration_tests/configured_catalog.json @@ -2,7 +2,7 @@ "streams": [ { "stream": { - "name": "Sheet1-one-col", + "name": "Sheet1 one col&special name%?", "json_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", diff --git a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml index 9804875138fce..41bbf428d9f48 100644 --- a/airbyte-integrations/connectors/source-google-sheets/metadata.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/metadata.yaml @@ -10,7 +10,7 @@ data: connectorSubtype: file connectorType: source definitionId: 71607ba1-c0ac-4799-8049-7f4b90dd50f7 - dockerImageTag: 0.9.0-rc.1 + dockerImageTag: 0.9.0-rc.2 dockerRepository: airbyte/source-google-sheets documentationUrl: https://docs.airbyte.com/integrations/sources/google-sheets githubIssueLabel: source-google-sheets diff --git a/airbyte-integrations/connectors/source-google-sheets/poetry.lock b/airbyte-integrations/connectors/source-google-sheets/poetry.lock index 8c351d65c9ea0..d8f7c9aa36063 100644 --- a/airbyte-integrations/connectors/source-google-sheets/poetry.lock +++ b/airbyte-integrations/connectors/source-google-sheets/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "airbyte-cdk" -version = "6.30.0" +version = "6.31.1" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "airbyte_cdk-6.30.0-py3-none-any.whl", hash = "sha256:0709d3748e8134562801369f969d3e298b2254c118523c54cc3bca51ddce75ff"}, - {file = "airbyte_cdk-6.30.0.tar.gz", hash = "sha256:82f411df532d1aeb88e5eec2c018e1ae830e5ab3a8bdb0a70be15070159a7b64"}, + {file = "airbyte_cdk-6.31.1-py3-none-any.whl", hash = "sha256:03383f318d6adf4eaf5d971166b0998aa5682d68422be888426ee8367513ffef"}, + {file = "airbyte_cdk-6.31.1.tar.gz", hash = "sha256:71478976338c0a3708e0b560072c7cc771bdf2ae047bfcad9ac1bfabf1aaaa57"}, ] [package.dependencies] diff --git a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml index 0d9eacbe6f03c..17a6e8274792b 100644 --- a/airbyte-integrations/connectors/source-google-sheets/pyproject.toml +++ b/airbyte-integrations/connectors/source-google-sheets/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "0.9.0-rc.1" +version = "0.9.0-rc.2" name = "source-google-sheets" description = "Source implementation for Google Sheets." authors = [ "Airbyte ",] diff --git a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml index e8868f0938a45..c3cfa25073121 100644 --- a/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml +++ b/airbyte-integrations/connectors/source-google-sheets/source_google_sheets/manifest.yaml @@ -51,7 +51,7 @@ dynamic_streams: name: "" http_method: GET path: >- - {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}/values:batchGet?ranges={{parameters["sheet_id"]| urlencode}}!{{stream_partition.start_range}}:{{stream_partition.end_range}}&majorDimension=ROWS&alt=json error_handler: type: DefaultErrorHandler backoff_strategies: @@ -85,7 +85,7 @@ dynamic_streams: sheet_id: "" http_method: GET path: >- - {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"]}}!1:1&alt=json + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{parameters["sheet_id"] | urlencode}}!1:1&alt=json error_handler: type: CompositeErrorHandler error_handlers: @@ -221,7 +221,7 @@ definitions: description: spreadsheet_id can be either the full url to spreadsheet or the spreadsheet id. http_method: GET path: >- - {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id}}!1:1&alt=json + {% if config["spreadsheet_id"] | regex_search("^(https://.*)") %}{{ config["spreadsheet_id"] | regex_search("/([-\\w]{20,})([/]?)") }}{% else %}{{ config["spreadsheet_id"] }}{% endif %}?includeGridData=true&ranges={{stream_partition.sheet_id | urlencode}}!1:1&alt=json error_handler: type: CompositeErrorHandler error_handlers: diff --git a/docs/integrations/sources/google-sheets.md b/docs/integrations/sources/google-sheets.md index 5d5e45cc97816..42e8e508f31fb 100644 --- a/docs/integrations/sources/google-sheets.md +++ b/docs/integrations/sources/google-sheets.md @@ -187,7 +187,8 @@ Airbyte batches requests to the API in order to efficiently pull data and respec | Version | Date | Pull Request | Subject | |------------|------------|----------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.9.0-rc.1 | 2025-02-03 | [50843](https://github.com/airbytehq/airbyte/pull/50843) | Migrate to low-code | +| 0.9.0-rc.2 | 2025-01-31 | [00000](https://github.com/airbytehq/airbyte/pull/00000) | Fix sheet id encoding | +| 0.9.0-rc.1 | 2025-01-30 | [50843](https://github.com/airbytehq/airbyte/pull/50843) | Migrate to low-code | | 0.8.5 | 2025-01-11 | [44270](https://github.com/airbytehq/airbyte/pull/44270) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | | 0.8.4 | 2024-12-09 | [48835](https://github.com/airbytehq/airbyte/pull/48835) | Implementing integration tests | | 0.7.4 | 2024-09-09 | [45108](https://github.com/airbytehq/airbyte/pull/45108) | Google Sheets API errors now cause syncs to fail | From 1b9c98da0e7f2fc1595e4100b83231e0914eb1f8 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi Date: Fri, 31 Jan 2025 01:25:41 +0100 Subject: [PATCH 63/63] Update expected records --- .../integration_tests/expected_records.txt | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt b/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt index 14d738e1457ce..caf20ab823afa 100644 --- a/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt +++ b/airbyte-integrations/connectors/source-google-sheets/integration_tests/expected_records.txt @@ -1,26 +1,26 @@ -{"stream":"Sheet1-one-col","data":{"ID":"aa"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"bb"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"1"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"2"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"3"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"4"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"5"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"6"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"7"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"8"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"9"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"10"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"11"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"12"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"13"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"14"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"15"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"16"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"17"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"18"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"19"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"20"},"emitted_at":1673989565000} -{"stream":"Sheet1-one-col","data":{"ID":"21"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"aa"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"bb"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"1"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"2"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"3"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"4"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"5"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"6"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"7"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"8"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"9"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"10"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"11"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"12"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"13"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"14"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"15"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"16"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"17"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"18"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"19"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"20"},"emitted_at":1673989565000} +{"stream":"Sheet1 one col&special name%?","data":{"ID":"21"},"emitted_at":1673989565000} {"stream":"Sheet2-two-cols","data":{"ID":"a","Name":"a"},"emitted_at":1673989565000} {"stream":"Sheet2-two-cols","data":{"ID":"b","Name":"b"},"emitted_at":1673989565000} {"stream":"Sheet2-two-cols","data":{"ID":"c","Name":"c"},"emitted_at":1673989565000}