From 7fc7b536e1fe7f219b984723fd020744d884bd54 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:28:18 -0700 Subject: [PATCH 01/32] Upgrade launcher script to the latest launcher version --- clabe_default.yml | 2 + .../launcher.py | 69 +-- uv.lock | 396 +++++------------- 3 files changed, 130 insertions(+), 337 deletions(-) create mode 100644 clabe_default.yml diff --git a/clabe_default.yml b/clabe_default.yml new file mode 100644 index 0000000..c04e48d --- /dev/null +++ b/clabe_default.yml @@ -0,0 +1,2 @@ +data_dir: C:/Data +subject: "123456" \ No newline at end of file diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py index 6dcebda..ab1bcbc 100644 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py +++ b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py @@ -1,16 +1,19 @@ +import logging from pathlib import Path -from typing import Optional +from typing import final import aind_behavior_experiment_launcher.launcher.behavior_launcher as behavior_launcher -from aind_behavior_experiment_launcher.apps import BonsaiApp +from aind_behavior_experiment_launcher.apps import AindBehaviorServicesBonsaiApp +from aind_behavior_experiment_launcher.launcher.behavior_launcher import DefaultBehaviorPicker from aind_behavior_experiment_launcher.resource_monitor import ( ResourceMonitor, available_storage_constraint_factory, remote_dir_exists_constraint_factory, ) -from aind_behavior_experiment_launcher.ui_helper import prompt_field_from_input +from aind_behavior_experiment_launcher.ui import prompt_field_from_input from aind_behavior_services.session import AindBehaviorSessionModel from pydantic import ValidationError +from pydantic_settings import CliApp from typing_extensions import override from aind_behavior_video_encoding_benchmarks.rig import AindVideoEncodingBenchmarksRig @@ -19,36 +22,13 @@ AindVideoEncodingBenchmarksTaskParameters, ) +logger = logging.getLogger(__name__) -class AindVideoEncodingBenchmarksLauncher( - behavior_launcher.BehaviorLauncher[ - AindVideoEncodingBenchmarksRig, AindBehaviorSessionModel, AindVideoEncodingBenchmarksTaskLogic - ] -): - @override - def _prompt_session_input(self, directory: Optional[str] = None) -> AindBehaviorSessionModel: - experimenter = self._ui_helper.prompt_experimenter(strict=True) - subject = input("Enter subject name: [defaults to 00000]") - if subject == "": - subject = "00000" - notes = self._ui_helper.prompt_get_notes() - - return self.session_schema_model( - experiment="", # Will be set later - root_path=str(self.data_dir.resolve()) - if not self.group_by_subject_log - else str(self.data_dir.resolve() / subject), - subject=subject, - notes=notes, - experimenter=experimenter if experimenter is not None else [], - commit_hash=self.repository.head.commit.hexsha, - allow_dirty_repo=self._debug_mode or self.allow_dirty, - skip_hardware_validation=self.skip_hardware_validation, - experiment_version="", # Will be set later - ) +@final +class _CustomPicker(DefaultBehaviorPicker): @override - def _prompt_task_logic_input(self, *args, **kwargs) -> AindVideoEncodingBenchmarksTaskLogic: + def pick_task_logic(self) -> AindVideoEncodingBenchmarksTaskLogic: save_raw = None while save_raw is None: try: @@ -56,47 +36,44 @@ def _prompt_task_logic_input(self, *args, **kwargs) -> AindVideoEncodingBenchmar AindVideoEncodingBenchmarksTaskParameters, "save_raw_video", default=False ) except ValidationError as e: - self._logger.error("Failed to parse input: %s", e) + self.launcher._logger.error("Failed to parse input: %s", e) else: - self._logger.info("save_raw_video set to: %s", save_raw) + self.launcher._logger.info("save_raw_video set to: %s", save_raw) return AindVideoEncodingBenchmarksTaskLogic( task_parameters=AindVideoEncodingBenchmarksTaskParameters(save_raw_video=save_raw) ) -def make_launcher() -> AindVideoEncodingBenchmarksLauncher: - data_dir = r"C:/Data" +def make_launcher(settings: behavior_launcher.BehaviorCliArgs) -> behavior_launcher.BehaviorLauncher: + data_dir = settings.data_dir remote_dir = Path(r"\\allen\aind\scratch\video-encoding-benchmarks\data") srv = behavior_launcher.BehaviorServicesFactoryManager() - srv.attach_bonsai_app(BonsaiApp(r"./src/main.bonsai")) + srv.attach_app(AindBehaviorServicesBonsaiApp(Path(r"./src/main.bonsai"))) srv.attach_data_transfer(behavior_launcher.robocopy_data_transfer_factory(Path(remote_dir))) srv.attach_resource_monitor( ResourceMonitor( constrains=[ - available_storage_constraint_factory(data_dir, 2e11), + available_storage_constraint_factory(Path(data_dir), 2e11), remote_dir_exists_constraint_factory(Path(remote_dir)), ] ) ) - return AindVideoEncodingBenchmarksLauncher( + return behavior_launcher.BehaviorLauncher( rig_schema_model=AindVideoEncodingBenchmarksRig, session_schema_model=AindBehaviorSessionModel, task_logic_schema_model=AindVideoEncodingBenchmarksTaskLogic, - data_dir=data_dir, - config_library_dir=r"\\allen\aind\scratch\AindBehavior.db\AindVideoEncodingBenchmarks", - temp_dir=r"./local/.temp", - allow_dirty=False, - skip_hardware_validation=False, - debug_mode=False, - group_by_subject_log=True, + picker=_CustomPicker( + config_library_dir=Path(r"\\allen\aind\scratch\AindBehavior.db\AindVideoEncodingBenchmarks") + ), + settings=settings, services=srv, - validate_init=True, ) def main(): - launcher = make_launcher() + args = CliApp().run(behavior_launcher.BehaviorCliArgs) + launcher = make_launcher(args) launcher.main() return None diff --git a/uv.lock b/uv.lock index 649f48b..2332c35 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,4 @@ version = 1 -revision = 1 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.12'", @@ -22,19 +21,20 @@ wheels = [ [[package]] name = "aind-behavior-experiment-launcher" -version = "0.3.3" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, { name = "aind-slims-api" }, { name = "gitpython" }, { name = "pydantic" }, + { name = "pydantic-settings" }, { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/fc/c54ba6989512395fc54dcc43a89d43a8a8d8aa25aac63197bf2ffa36bdd8/aind_behavior_experiment_launcher-0.3.3.tar.gz", hash = "sha256:92f797720f6f45eb136b2d002b734400092b04fc4b5201954ca8bc53f43ed722", size = 121723 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/449f9450ddb265a9382b2a8fe943dc3943a623af99e41dde7c2234664528/aind_behavior_experiment_launcher-0.4.1.tar.gz", hash = "sha256:b6e1a9ec016b393edb12989a5dbf4d119e5a94ee71a1499052b26d019e3c4d2d", size = 124337 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/07/35ddfc458f7ffc7e0bac7e4e536365e0d0447f33238a683486826f07fcb1/aind_behavior_experiment_launcher-0.3.3-py3-none-any.whl", hash = "sha256:9c5913f1962968adec8ba98e354aeff1a7f6e47eea761b01055cbfad65b775b4", size = 31786 }, + { url = "https://files.pythonhosted.org/packages/ba/62/c9387a44401bc73ad79007bc36f2a13e43e1ee323d7c0aae9667f612f5d2/aind_behavior_experiment_launcher-0.4.1-py3-none-any.whl", hash = "sha256:b8d2494cf4848cbe59d0bb33069501182827cc0ee225142040b4b26b190b5c8f", size = 44881 }, ] [package.optional-dependencies] @@ -99,37 +99,33 @@ requires-dist = [ { name = "sphinx-jinja", marker = "extra == 'docs'" }, { name = "sphinx-jsonschema", marker = "extra == 'docs'" }, ] -provides-extras = ["launcher", "dev", "docs"] [[package]] name = "aind-codeocean-pipeline-monitor" -version = "0.6.2" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "codeocean" }, { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/85/601aeb728bdc7d087475015b951f3babe5d8e7411d385b9ec9f7264f2d9a/aind_codeocean_pipeline_monitor-0.6.2.tar.gz", hash = "sha256:8b7952ec78fb6127438792c618805c0e6e4f067f4c2adeb27dd548de77282722", size = 47089 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/26/2762b2556406990d47589b093801e17a67a0afb6e06c91182152228135f6/aind_codeocean_pipeline_monitor-0.7.1.tar.gz", hash = "sha256:2239abd128a4d68103e4cfd5a5aa8c261d2b5d24725b0e96e29ece629e881ab8", size = 47629 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/9a/4a839a5040c570a493cff319a0f5c302567ce16f34e2220d105428e3d447/aind_codeocean_pipeline_monitor-0.6.2-py3-none-any.whl", hash = "sha256:e45e7765236d6748afae5a55f5614b0d15fe897052999b78897223a08962f49c", size = 11270 }, + { url = "https://files.pythonhosted.org/packages/8c/39/c244595e55bc315ffbf4d4629e159ccdd2b0f84e7e88bb241bb870f78e64/aind_codeocean_pipeline_monitor-0.7.1-py3-none-any.whl", hash = "sha256:8a3a25efdcb0b9020927d3646b52cbe4214f93fde189c101977c5a6d9f10fc05", size = 11525 }, ] [[package]] name = "aind-data-schema" -version = "1.3.0" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, - { name = "dictdiffer" }, - { name = "inflection" }, - { name = "jsonschema" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/84/51128de3d7d4a26e00c233d02d898124c0fdb86da085d48d8e821e2f6a00/aind_data_schema-1.3.0.tar.gz", hash = "sha256:554590ff4ea2fc3b1c146cec5bb068e134575d7acfcb8cc34c3fefdced2c4e28", size = 857427 } +sdist = { url = "https://files.pythonhosted.org/packages/34/d3/b8c49737c207966eef2a19f74f599b69f4b7fc3d8abfc33a164397252088/aind_data_schema-1.4.0.tar.gz", hash = "sha256:9768e00ee1f7ea4da72abc4b365ee807c2129dd30da96e759ae17ed93824b40e", size = 858325 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/3b/75700474073a8d15dc968b59c539253788dd8193fa8dbc9ab5cfeeb4545f/aind_data_schema-1.3.0-py3-none-any.whl", hash = "sha256:ef6c999c15d87bf4bbd783c8e71d39ef960d9c41f54520f9b2d2624adc0a5eb0", size = 64624 }, + { url = "https://files.pythonhosted.org/packages/02/da/bce4b9d3122cb98e055d7a9d3159117eb810992605aa849bef4b9e8069fc/aind_data_schema-1.4.0-py3-none-any.whl", hash = "sha256:d82fbbd96f3588a9b03b0275bb89831a1b901c5b63e8790f07583d0fd4a4c732", size = 65020 }, ] [[package]] @@ -147,7 +143,7 @@ wheels = [ [[package]] name = "aind-data-transfer-models" -version = "0.15.3" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-codeocean-pipeline-monitor" }, @@ -159,9 +155,9 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/93/2f96d92453564a0f749f5bf91f34c16a179ff2ede82a94f1fafdd16c5b72/aind_data_transfer_models-0.15.3.tar.gz", hash = "sha256:54f530b1ae7bf007b73808f61f9766f4d1c0ca30ab45a485ef1161a367a8aa95", size = 49298 } +sdist = { url = "https://files.pythonhosted.org/packages/e0/a0/4e96d2fdbc4a90ed4db7e18d9d18f6e6fa903bd7abddb0cb0021469ce613/aind_data_transfer_models-0.17.0.tar.gz", hash = "sha256:41963e417b3f25fb2106174979fec91f737c88fd470aa3a5943153d91f334c6d", size = 49363 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/c0/c3f75977074df82299dbc2a722900724d2777b2b46f2d6ca91429356f6ca/aind_data_transfer_models-0.15.3-py3-none-any.whl", hash = "sha256:7dd2d1ddbca95906a7502b8ac39bf089ce1377fce0570916f5bc416fb0cbb0f8", size = 14533 }, + { url = "https://files.pythonhosted.org/packages/0a/16/78b414d802a75e0bcba8248e5f18b418470a5c405e736fe24da993e1a303/aind_data_transfer_models-0.17.0-py3-none-any.whl", hash = "sha256:7291e5caf105be1f17fbaad8bc54f8fe9ccc19173c07a91441aee5d74d18c867", size = 14514 }, ] [[package]] @@ -208,19 +204,16 @@ wheels = [ [[package]] name = "aind-watchdog-service" -version = "0.1.1" +version = "0.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, { name = "aind-data-transfer-models" }, - { name = "apscheduler" }, { name = "pyyaml" }, - { name = "requests" }, - { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/29/9beadd2043ee93e812a4ab6e049b6810fe686d76abdd2826d126b7d50ca9/aind_watchdog_service-0.1.1.tar.gz", hash = "sha256:a4d1862bae4f910af845b2c9634463d0202fb63833fd83df90a64cd6fd68003e", size = 389992 } +sdist = { url = "https://files.pythonhosted.org/packages/56/c9/2ef15e05eb8ad53a1b29fcc41d262f65e26d4aafe9e4dddd728c6b49829c/aind_watchdog_service-0.1.4.tar.gz", hash = "sha256:9e4d256ef4724c8c6c182e29bc0438ec3dcafd8369dcd5204e2e78aa07988762", size = 402285 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/23/d4ab38e83c7a9c2e0885c0688594547abe9e416ffd6670f4ab577b9749c2/aind_watchdog_service-0.1.1-py3-none-any.whl", hash = "sha256:087d952405feb15523a4862c5af6ad337be8d624f24730a2369d6acdb4115852", size = 45999 }, + { url = "https://files.pythonhosted.org/packages/36/07/27ae97292be5569d7c947e035e9e193c183e278d47970c3b94a7f7962357/aind_watchdog_service-0.1.4-py3-none-any.whl", hash = "sha256:5cb1ec5f680b0c5029c995f22cd2cf44494486b68042854a4bdfa55ed37994f4", size = 50685 }, ] [[package]] @@ -241,27 +234,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] -[[package]] -name = "apscheduler" -version = "3.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tzlocal" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004 }, -] - -[[package]] -name = "attrs" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, -] - [[package]] name = "autodoc-pydantic" version = "2.2.0" @@ -382,16 +354,16 @@ wheels = [ [[package]] name = "codeocean" -version = "0.3.2" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dataclasses-json" }, { name = "requests" }, { name = "requests-toolbelt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/c4/3af215b0319de084e7d39cc9698f1618ba25d64ec4504e5385bdf6976dfd/codeocean-0.3.2.tar.gz", hash = "sha256:9df985c064d22c07c636ab288f5fa4d62a6bb6e226823f2f5620288bc0907385", size = 8557 } +sdist = { url = "https://files.pythonhosted.org/packages/ea/86/509616d367bb1c7b1d08cdb407636f17dc34ce976d8f003290248fcb5d8c/codeocean-0.5.0.tar.gz", hash = "sha256:5631d80778106b189c7d58417ebc66a86e70a6d4a1f631103c97de69ee59666b", size = 8611 } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/bf/e67a7e57f2ec74bb16c110a131530584e8a528e8afc53e0ee9032c94cb6d/codeocean-0.3.2-py3-none-any.whl", hash = "sha256:984a531ad27d50bc7525b9af7e36f9ffa38768e6e955bd7774ed74a779b8811c", size = 9445 }, + { url = "https://files.pythonhosted.org/packages/9f/11/491dd89d5a1abcfba756c4a24eb88b639aae163965a55062a8311c8f5d27/codeocean-0.5.0-py3-none-any.whl", hash = "sha256:9434310e7c51a05897f3f82ba8c2a7ba9aaf0768cf9f2b454a03c88fbb74e98c", size = 9482 }, ] [[package]] @@ -437,15 +409,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, ] -[[package]] -name = "dictdiffer" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/7b/35cbccb7effc5d7e40f4c55e2b79399e1853041997fcda15c9ff160abba0/dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578", size = 31513 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/ef/4cb333825d10317a36a1154341ba37e6e9c087bac99c1990ef07ffdb376f/dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595", size = 16754 }, -] - [[package]] name = "dnspython" version = "2.7.0" @@ -552,15 +515,15 @@ wheels = [ [[package]] name = "harp-python" -version = "0.3.0" +version = "0.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pandas" }, { name = "pydantic-yaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/104dcb4978e9d485c38677227c0252b0dacd2bd086066a41fce95ce7068c/harp_python-0.3.0.tar.gz", hash = "sha256:af6d406b9b7f697deabd6e70a9ed8bf1b0619bdc5672d8ed0a2eb645dbe1e79d", size = 13372 } +sdist = { url = "https://files.pythonhosted.org/packages/96/06/76f8f5880a529da914ecb90a808aa54c460f740ab1716c22215e7c8f5b6e/harp_python-0.4.0.tar.gz", hash = "sha256:d2fddb6890e2d52897a3a6d8d5932c0ea569f44340c17c43c7a34c69ef69bbe8", size = 15483 } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/a3/ec29a871fb25f2399cd74161a31c30fc028258ee2e2f50c599119659f53e/harp_python-0.3.0-py3-none-any.whl", hash = "sha256:a5eac6e460ba3b2d9aa52626d37cf57c4a43c59ec4a741ca55950c339945238f", size = 10939 }, + { url = "https://files.pythonhosted.org/packages/1c/4c/0b0829ec8444fa995f3719563ff16352ef21c02e665f4f9dc764e085901e/harp_python-0.4.0-py3-none-any.whl", hash = "sha256:1c9f00236dcd9ee4a9ba76087c86ddf5644c20b28b9a211531db9e3897993eea", size = 12599 }, ] [[package]] @@ -590,15 +553,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, ] -[[package]] -name = "inflection" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454 }, -] - [[package]] name = "itsdangerous" version = "2.2.0" @@ -610,14 +564,14 @@ wheels = [ [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] @@ -638,33 +592,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, ] -[[package]] -name = "jsonschema" -version = "4.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2024.10.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -786,50 +713,50 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/86/453aa3949eab6ff54e2405f9cb0c01f756f031c3dc2a6d60a1d40cba5488/numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8", size = 21237256 }, - { url = "https://files.pythonhosted.org/packages/20/c3/93ecceadf3e155d6a9e4464dd2392d8d80cf436084c714dc8535121c83e8/numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b", size = 14408049 }, - { url = "https://files.pythonhosted.org/packages/8d/29/076999b69bd9264b8df5e56f2be18da2de6b2a2d0e10737e5307592e01de/numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a", size = 5408655 }, - { url = "https://files.pythonhosted.org/packages/e2/a7/b14f0a73eb0fe77cb9bd5b44534c183b23d4229c099e339c522724b02678/numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636", size = 6949996 }, - { url = "https://files.pythonhosted.org/packages/72/2f/8063da0616bb0f414b66dccead503bd96e33e43685c820e78a61a214c098/numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d", size = 14355789 }, - { url = "https://files.pythonhosted.org/packages/e6/d7/3cd47b00b8ea95ab358c376cf5602ad21871410950bc754cf3284771f8b6/numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb", size = 16411356 }, - { url = "https://files.pythonhosted.org/packages/27/c0/a2379e202acbb70b85b41483a422c1e697ff7eee74db642ca478de4ba89f/numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2", size = 15576770 }, - { url = "https://files.pythonhosted.org/packages/bc/63/a13ee650f27b7999e5b9e1964ae942af50bb25606d088df4229283eda779/numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b", size = 18200483 }, - { url = "https://files.pythonhosted.org/packages/4c/87/e71f89935e09e8161ac9c590c82f66d2321eb163893a94af749dfa8a3cf8/numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5", size = 6588415 }, - { url = "https://files.pythonhosted.org/packages/b9/c6/cd4298729826af9979c5f9ab02fcaa344b82621e7c49322cd2d210483d3f/numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f", size = 12929604 }, - { url = "https://files.pythonhosted.org/packages/43/ec/43628dcf98466e087812142eec6d1c1a6c6bdfdad30a0aa07b872dc01f6f/numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d", size = 20929458 }, - { url = "https://files.pythonhosted.org/packages/9b/c0/2f4225073e99a5c12350954949ed19b5d4a738f541d33e6f7439e33e98e4/numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95", size = 14115299 }, - { url = "https://files.pythonhosted.org/packages/ca/fa/d2c5575d9c734a7376cc1592fae50257ec95d061b27ee3dbdb0b3b551eb2/numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea", size = 5145723 }, - { url = "https://files.pythonhosted.org/packages/eb/dc/023dad5b268a7895e58e791f28dc1c60eb7b6c06fcbc2af8538ad069d5f3/numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532", size = 6678797 }, - { url = "https://files.pythonhosted.org/packages/3f/19/bcd641ccf19ac25abb6fb1dcd7744840c11f9d62519d7057b6ab2096eb60/numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e", size = 14067362 }, - { url = "https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe", size = 16116679 }, - { url = "https://files.pythonhosted.org/packages/d0/a1/e90f7aa66512be3150cb9d27f3d9995db330ad1b2046474a13b7040dfd92/numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021", size = 15264272 }, - { url = "https://files.pythonhosted.org/packages/dc/b6/50bd027cca494de4fa1fc7bf1662983d0ba5f256fa0ece2c376b5eb9b3f0/numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8", size = 17880549 }, - { url = "https://files.pythonhosted.org/packages/96/30/f7bf4acb5f8db10a96f73896bdeed7a63373137b131ca18bd3dab889db3b/numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe", size = 6293394 }, - { url = "https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d", size = 12626357 }, - { url = "https://files.pythonhosted.org/packages/0e/8b/88b98ed534d6a03ba8cddb316950fe80842885709b58501233c29dfa24a9/numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba", size = 20916001 }, - { url = "https://files.pythonhosted.org/packages/d9/b4/def6ec32c725cc5fbd8bdf8af80f616acf075fe752d8a23e895da8c67b70/numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50", size = 14130721 }, - { url = "https://files.pythonhosted.org/packages/20/60/70af0acc86495b25b672d403e12cb25448d79a2b9658f4fc45e845c397a8/numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1", size = 5130999 }, - { url = "https://files.pythonhosted.org/packages/2e/69/d96c006fb73c9a47bcb3611417cf178049aae159afae47c48bd66df9c536/numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5", size = 6665299 }, - { url = "https://files.pythonhosted.org/packages/5a/3f/d8a877b6e48103733ac224ffa26b30887dc9944ff95dffdfa6c4ce3d7df3/numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2", size = 14064096 }, - { url = "https://files.pythonhosted.org/packages/e4/43/619c2c7a0665aafc80efca465ddb1f260287266bdbdce517396f2f145d49/numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1", size = 16114758 }, - { url = "https://files.pythonhosted.org/packages/d9/79/ee4fe4f60967ccd3897aa71ae14cdee9e3c097e3256975cc9575d393cb42/numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304", size = 15259880 }, - { url = "https://files.pythonhosted.org/packages/fb/c8/8b55cf05db6d85b7a7d414b3d1bd5a740706df00bfa0824a08bf041e52ee/numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d", size = 17876721 }, - { url = "https://files.pythonhosted.org/packages/21/d6/b4c2f0564b7dcc413117b0ffbb818d837e4b29996b9234e38b2025ed24e7/numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693", size = 6290195 }, - { url = "https://files.pythonhosted.org/packages/97/e7/7d55a86719d0de7a6a597949f3febefb1009435b79ba510ff32f05a8c1d7/numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b", size = 12619013 }, - { url = "https://files.pythonhosted.org/packages/a6/1f/0b863d5528b9048fd486a56e0b97c18bf705e88736c8cea7239012119a54/numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890", size = 20944621 }, - { url = "https://files.pythonhosted.org/packages/aa/99/b478c384f7a0a2e0736177aafc97dc9152fc036a3fdb13f5a3ab225f1494/numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c", size = 14142502 }, - { url = "https://files.pythonhosted.org/packages/fb/61/2d9a694a0f9cd0a839501d362de2a18de75e3004576a3008e56bdd60fcdb/numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94", size = 5176293 }, - { url = "https://files.pythonhosted.org/packages/33/35/51e94011b23e753fa33f891f601e5c1c9a3d515448659b06df9d40c0aa6e/numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0", size = 6691874 }, - { url = "https://files.pythonhosted.org/packages/ff/cf/06e37619aad98a9d03bd8d65b8e3041c3a639be0f5f6b0a0e2da544538d4/numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610", size = 14036826 }, - { url = "https://files.pythonhosted.org/packages/0c/93/5d7d19955abd4d6099ef4a8ee006f9ce258166c38af259f9e5558a172e3e/numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76", size = 16096567 }, - { url = "https://files.pythonhosted.org/packages/af/53/d1c599acf7732d81f46a93621dab6aa8daad914b502a7a115b3f17288ab2/numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a", size = 15242514 }, - { url = "https://files.pythonhosted.org/packages/53/43/c0f5411c7b3ea90adf341d05ace762dad8cb9819ef26093e27b15dd121ac/numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf", size = 17872920 }, - { url = "https://files.pythonhosted.org/packages/5b/57/6dbdd45ab277aff62021cafa1e15f9644a52f5b5fc840bc7591b4079fb58/numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef", size = 6346584 }, - { url = "https://files.pythonhosted.org/packages/97/9b/484f7d04b537d0a1202a5ba81c6f53f1846ae6c63c2127f8df869ed31342/numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082", size = 12706784 }, +version = "2.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, + { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, + { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, + { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, + { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, + { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, + { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, + { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, + { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, + { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, + { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, + { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, + { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, + { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, + { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, + { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, + { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, + { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, + { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, + { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, + { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, + { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, + { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, + { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, + { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, + { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, + { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, + { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, + { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, + { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, + { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, + { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, + { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, + { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, + { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, + { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, + { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, + { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, + { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, + { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, ] [[package]] @@ -960,15 +887,15 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.8.0" +version = "2.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/a2/ad2511ede77bb424f3939e5148a56d968cdc6b1462620d24b2a1f4ab65b4/pydantic_settings-2.8.0.tar.gz", hash = "sha256:88e2ca28f6e68ea102c99c3c401d6c9078e68a5df600e97b43891c34e089500a", size = 83347 } +sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/a9/3b9642025174bbe67e900785fb99c9bfe91ea584b0b7126ff99945c24a0e/pydantic_settings-2.8.0-py3-none-any.whl", hash = "sha256:c782c7dc3fb40e97b238e713c25d26f64314aece2e91abcff592fcac15f71820", size = 30746 }, + { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, ] [[package]] @@ -1065,20 +992,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] -[[package]] -name = "referencing" -version = "0.36.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, -] - [[package]] name = "requests" version = "2.32.3" @@ -1132,66 +1045,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] -[[package]] -name = "rpds-py" -version = "0.23.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/79/2ce611b18c4fd83d9e3aecb5cba93e1917c050f556db39842889fa69b79f/rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707", size = 26806 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/67/6e5d4234bb9dee062ffca2a5f3c7cd38716317d6760ec235b175eed4de2c/rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590", size = 372264 }, - { url = "https://files.pythonhosted.org/packages/a7/0a/3dedb2daee8e783622427f5064e2d112751d8276ee73aa5409f000a132f4/rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4", size = 356883 }, - { url = "https://files.pythonhosted.org/packages/ed/fc/e1acef44f9c24b05fe5434b235f165a63a52959ac655e3f7a55726cee1a4/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee", size = 385624 }, - { url = "https://files.pythonhosted.org/packages/97/0a/a05951f6465d01622720c03ef6ef31adfbe865653e05ed7c45837492f25e/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd", size = 391500 }, - { url = "https://files.pythonhosted.org/packages/ea/2e/cca0583ec0690ea441dceae23c0673b99755710ea22f40bccf1e78f41481/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5", size = 444869 }, - { url = "https://files.pythonhosted.org/packages/cc/e6/95cda68b33a6d814d1e96b0e406d231ed16629101460d1740e92f03365e6/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447", size = 444930 }, - { url = "https://files.pythonhosted.org/packages/5f/a7/e94cdb73411ae9c11414d3c7c9a6ad75d22ad4a8d094fb45a345ba9e3018/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580", size = 386254 }, - { url = "https://files.pythonhosted.org/packages/dd/c5/a4a943d90a39e85efd1e04b1ad5129936786f9a9aa27bb7be8fc5d9d50c9/rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1", size = 417090 }, - { url = "https://files.pythonhosted.org/packages/0c/a0/80d0013b12428d1fce0ab4e71829400b0a32caec12733c79e6109f843342/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966", size = 557639 }, - { url = "https://files.pythonhosted.org/packages/a6/92/ec2e6980afb964a2cd7a99cbdef1f6c01116abe94b42cbe336ac93dd11c2/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35", size = 584572 }, - { url = "https://files.pythonhosted.org/packages/3d/ce/75b6054db34a390789a82523790717b27c1bd735e453abb429a87c4f0f26/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522", size = 553028 }, - { url = "https://files.pythonhosted.org/packages/cc/24/f45abe0418c06a5cba0f846e967aa27bac765acd927aabd857c21319b8cc/rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6", size = 220862 }, - { url = "https://files.pythonhosted.org/packages/2d/a6/3c0880e8bbfc36451ef30dc416266f6d2934705e468db5d21c8ba0ab6400/rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf", size = 232953 }, - { url = "https://files.pythonhosted.org/packages/f3/8c/d17efccb9f5b9137ddea706664aebae694384ae1d5997c0202093e37185a/rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c", size = 364369 }, - { url = "https://files.pythonhosted.org/packages/6e/c0/ab030f696b5c573107115a88d8d73d80f03309e60952b64c584c70c659af/rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba", size = 349965 }, - { url = "https://files.pythonhosted.org/packages/b3/55/b40170f5a079c4fb0b6a82b299689e66e744edca3c3375a8b160fb797660/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31", size = 389064 }, - { url = "https://files.pythonhosted.org/packages/ab/1c/b03a912c59ec7c1e16b26e587b9dfa8ddff3b07851e781e8c46e908a365a/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149", size = 397741 }, - { url = "https://files.pythonhosted.org/packages/52/6f/151b90792b62fb6f87099bcc9044c626881fdd54e31bf98541f830b15cea/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c", size = 448784 }, - { url = "https://files.pythonhosted.org/packages/71/2a/6de67c0c97ec7857e0e9e5cd7c52405af931b303eb1e5b9eff6c50fd9a2e/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5", size = 440203 }, - { url = "https://files.pythonhosted.org/packages/db/5e/e759cd1c276d98a4b1f464b17a9bf66c65d29f8f85754e27e1467feaa7c3/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc", size = 391611 }, - { url = "https://files.pythonhosted.org/packages/1c/1e/2900358efcc0d9408c7289769cba4c0974d9db314aa884028ed7f7364f61/rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35", size = 423306 }, - { url = "https://files.pythonhosted.org/packages/23/07/6c177e6d059f5d39689352d6c69a926ee4805ffdb6f06203570234d3d8f7/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b", size = 562323 }, - { url = "https://files.pythonhosted.org/packages/70/e4/f9097fd1c02b516fff9850792161eb9fc20a2fd54762f3c69eae0bdb67cb/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef", size = 588351 }, - { url = "https://files.pythonhosted.org/packages/87/39/5db3c6f326bfbe4576ae2af6435bd7555867d20ae690c786ff33659f293b/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad", size = 557252 }, - { url = "https://files.pythonhosted.org/packages/fd/14/2d5ad292f144fa79bafb78d2eb5b8a3a91c358b6065443cb9c49b5d1fedf/rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057", size = 222181 }, - { url = "https://files.pythonhosted.org/packages/a3/4f/0fce63e0f5cdd658e71e21abd17ac1bc9312741ebb8b3f74eeed2ebdf771/rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165", size = 237426 }, - { url = "https://files.pythonhosted.org/packages/13/9d/b8b2c0edffb0bed15be17b6d5ab06216f2f47f9ee49259c7e96a3ad4ca42/rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935", size = 363672 }, - { url = "https://files.pythonhosted.org/packages/bd/c2/5056fa29e6894144d7ba4c938b9b0445f75836b87d2dd00ed4999dc45a8c/rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4", size = 349602 }, - { url = "https://files.pythonhosted.org/packages/b0/bc/33779a1bb0ee32d8d706b173825aab75c628521d23ce72a7c1e6a6852f86/rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6", size = 388746 }, - { url = "https://files.pythonhosted.org/packages/62/0b/71db3e36b7780a619698ec82a9c87ab44ad7ca7f5480913e8a59ff76f050/rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10", size = 397076 }, - { url = "https://files.pythonhosted.org/packages/bb/2e/494398f613edf77ba10a916b1ddea2acce42ab0e3b62e2c70ffc0757ce00/rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122", size = 448399 }, - { url = "https://files.pythonhosted.org/packages/dd/53/4bd7f5779b1f463243ee5fdc83da04dd58a08f86e639dbffa7a35f969a84/rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4", size = 439764 }, - { url = "https://files.pythonhosted.org/packages/f6/55/b3c18c04a460d951bf8e91f2abf46ce5b6426fb69784166a6a25827cb90a/rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013", size = 390662 }, - { url = "https://files.pythonhosted.org/packages/2a/65/cc463044a3cbd616029b2aa87a651cdee8288d2fdd7780b2244845e934c1/rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64", size = 422680 }, - { url = "https://files.pythonhosted.org/packages/fa/8e/1fa52990c7836d72e8d70cd7753f2362c72fbb0a49c1462e8c60e7176d0b/rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8", size = 561792 }, - { url = "https://files.pythonhosted.org/packages/57/b8/fe3b612979b1a29d0c77f8585903d8b3a292604b26d4b300e228b8ac6360/rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957", size = 588127 }, - { url = "https://files.pythonhosted.org/packages/44/2d/fde474de516bbc4b9b230f43c98e7f8acc5da7fc50ceed8e7af27553d346/rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93", size = 556981 }, - { url = "https://files.pythonhosted.org/packages/18/57/767deeb27b81370bbab8f74ef6e68d26c4ea99018f3c71a570e506fede85/rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd", size = 221936 }, - { url = "https://files.pythonhosted.org/packages/7d/6c/3474cfdd3cafe243f97ab8474ea8949236eb2a1a341ca55e75ce00cd03da/rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70", size = 237145 }, - { url = "https://files.pythonhosted.org/packages/ec/77/e985064c624230f61efa0423759bb066da56ebe40c654f8b5ba225bd5d63/rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731", size = 359623 }, - { url = "https://files.pythonhosted.org/packages/62/d9/a33dcbf62b29e40559e012d525bae7d516757cf042cc9234bd34ca4b6aeb/rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5", size = 345900 }, - { url = "https://files.pythonhosted.org/packages/92/eb/f81a4be6397861adb2cb868bb6a28a33292c2dcac567d1dc575226055e55/rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a", size = 386426 }, - { url = "https://files.pythonhosted.org/packages/09/47/1f810c9b5e83be005341201b5389f1d240dfa440346ea7189f9b3fd6961d/rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e", size = 392314 }, - { url = "https://files.pythonhosted.org/packages/83/bd/bc95831432fd6c46ed8001f01af26de0763a059d6d7e6d69e3c5bf02917a/rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f", size = 447706 }, - { url = "https://files.pythonhosted.org/packages/19/3e/567c04c226b1802dc6dc82cad3d53e1fa0a773258571c74ac5d8fbde97ed/rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219", size = 437060 }, - { url = "https://files.pythonhosted.org/packages/fe/77/a77d2c6afe27ae7d0d55fc32f6841502648070dc8d549fcc1e6d47ff8975/rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722", size = 389347 }, - { url = "https://files.pythonhosted.org/packages/3f/47/6b256ff20a74cfebeac790ab05586e0ac91f88e331125d4740a6c86fc26f/rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e", size = 415554 }, - { url = "https://files.pythonhosted.org/packages/fc/29/d4572469a245bc9fc81e35166dca19fc5298d5c43e1a6dd64bf145045193/rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6", size = 557418 }, - { url = "https://files.pythonhosted.org/packages/9c/0a/68cf7228895b1a3f6f39f51b15830e62456795e61193d2c8b87fd48c60db/rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b", size = 583033 }, - { url = "https://files.pythonhosted.org/packages/14/18/017ab41dcd6649ad5db7d00155b4c212b31ab05bd857d5ba73a1617984eb/rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5", size = 554880 }, - { url = "https://files.pythonhosted.org/packages/2e/dd/17de89431268da8819d8d51ce67beac28d9b22fccf437bc5d6d2bcd1acdb/rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7", size = 219743 }, - { url = "https://files.pythonhosted.org/packages/68/15/6d22d07e063ce5e9bfbd96db9ec2fbb4693591b4503e3a76996639474d02/rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d", size = 235415 }, -] - [[package]] name = "ruamel-yaml" version = "0.18.10" @@ -1241,27 +1094,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.9.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/39/8b/a86c300359861b186f18359adf4437ac8e4c52e42daa9eedc731ef9d5b53/ruff-0.9.7.tar.gz", hash = "sha256:643757633417907510157b206e490c3aa11cab0c087c912f60e07fbafa87a4c6", size = 3669813 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/f3/3a1d22973291226df4b4e2ff70196b926b6f910c488479adb0eeb42a0d7f/ruff-0.9.7-py3-none-linux_armv6l.whl", hash = "sha256:99d50def47305fe6f233eb8dabfd60047578ca87c9dcb235c9723ab1175180f4", size = 11774588 }, - { url = "https://files.pythonhosted.org/packages/8e/c9/b881f4157b9b884f2994fd08ee92ae3663fb24e34b0372ac3af999aa7fc6/ruff-0.9.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d59105ae9c44152c3d40a9c40d6331a7acd1cdf5ef404fbe31178a77b174ea66", size = 11746848 }, - { url = "https://files.pythonhosted.org/packages/14/89/2f546c133f73886ed50a3d449e6bf4af27d92d2f960a43a93d89353f0945/ruff-0.9.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f313b5800483770bd540cddac7c90fc46f895f427b7820f18fe1822697f1fec9", size = 11177525 }, - { url = "https://files.pythonhosted.org/packages/d7/93/6b98f2c12bf28ab9def59c50c9c49508519c5b5cfecca6de871cf01237f6/ruff-0.9.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042ae32b41343888f59c0a4148f103208bf6b21c90118d51dc93a68366f4e903", size = 11996580 }, - { url = "https://files.pythonhosted.org/packages/8e/3f/b3fcaf4f6d875e679ac2b71a72f6691a8128ea3cb7be07cbb249f477c061/ruff-0.9.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87862589373b33cc484b10831004e5e5ec47dc10d2b41ba770e837d4f429d721", size = 11525674 }, - { url = "https://files.pythonhosted.org/packages/f0/48/33fbf18defb74d624535d5d22adcb09a64c9bbabfa755bc666189a6b2210/ruff-0.9.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a17e1e01bee0926d351a1ee9bc15c445beae888f90069a6192a07a84af544b6b", size = 12739151 }, - { url = "https://files.pythonhosted.org/packages/63/b5/7e161080c5e19fa69495cbab7c00975ef8a90f3679caa6164921d7f52f4a/ruff-0.9.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7c1f880ac5b2cbebd58b8ebde57069a374865c73f3bf41f05fe7a179c1c8ef22", size = 13416128 }, - { url = "https://files.pythonhosted.org/packages/4e/c8/b5e7d61fb1c1b26f271ac301ff6d9de5e4d9a9a63f67d732fa8f200f0c88/ruff-0.9.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e63fc20143c291cab2841dbb8260e96bafbe1ba13fd3d60d28be2c71e312da49", size = 12870858 }, - { url = "https://files.pythonhosted.org/packages/da/cb/2a1a8e4e291a54d28259f8fc6a674cd5b8833e93852c7ef5de436d6ed729/ruff-0.9.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91ff963baed3e9a6a4eba2a02f4ca8eaa6eba1cc0521aec0987da8d62f53cbef", size = 14786046 }, - { url = "https://files.pythonhosted.org/packages/ca/6c/c8f8a313be1943f333f376d79724260da5701426c0905762e3ddb389e3f4/ruff-0.9.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88362e3227c82f63eaebf0b2eff5b88990280fb1ecf7105523883ba8c3aaf6fb", size = 12550834 }, - { url = "https://files.pythonhosted.org/packages/9d/ad/f70cf5e8e7c52a25e166bdc84c082163c9c6f82a073f654c321b4dff9660/ruff-0.9.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0372c5a90349f00212270421fe91874b866fd3626eb3b397ede06cd385f6f7e0", size = 11961307 }, - { url = "https://files.pythonhosted.org/packages/52/d5/4f303ea94a5f4f454daf4d02671b1fbfe2a318b5fcd009f957466f936c50/ruff-0.9.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d76b8ab60e99e6424cd9d3d923274a1324aefce04f8ea537136b8398bbae0a62", size = 11612039 }, - { url = "https://files.pythonhosted.org/packages/eb/c8/bd12a23a75603c704ce86723be0648ba3d4ecc2af07eecd2e9fa112f7e19/ruff-0.9.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c439bdfc8983e1336577f00e09a4e7a78944fe01e4ea7fe616d00c3ec69a3d0", size = 12168177 }, - { url = "https://files.pythonhosted.org/packages/cc/57/d648d4f73400fef047d62d464d1a14591f2e6b3d4a15e93e23a53c20705d/ruff-0.9.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:115d1f15e8fdd445a7b4dc9a30abae22de3f6bcabeb503964904471691ef7606", size = 12610122 }, - { url = "https://files.pythonhosted.org/packages/49/79/acbc1edd03ac0e2a04ae2593555dbc9990b34090a9729a0c4c0cf20fb595/ruff-0.9.7-py3-none-win32.whl", hash = "sha256:e9ece95b7de5923cbf38893f066ed2872be2f2f477ba94f826c8defdd6ec6b7d", size = 9988751 }, - { url = "https://files.pythonhosted.org/packages/6d/95/67153a838c6b6ba7a2401241fd8a00cd8c627a8e4a0491b8d853dedeffe0/ruff-0.9.7-py3-none-win_amd64.whl", hash = "sha256:3770fe52b9d691a15f0b87ada29c45324b2ace8f01200fb0c14845e499eb0c2c", size = 11002987 }, - { url = "https://files.pythonhosted.org/packages/63/6a/aca01554949f3a401991dc32fe22837baeaccb8a0d868256cbb26a029778/ruff-0.9.7-py3-none-win_arm64.whl", hash = "sha256:b075a700b2533feb7a01130ff656a4ec0d5f340bb540ad98759b8401c32c2037", size = 10177763 }, +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 }, + { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 }, + { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 }, + { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 }, + { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 }, + { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 }, + { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 }, + { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 }, + { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 }, + { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 }, + { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 }, + { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 }, + { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 }, + { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 }, + { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 }, + { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 }, + { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, ] [[package]] @@ -1373,7 +1226,7 @@ wheels = [ [[package]] name = "slims-python-api" -version = "6.9.0" +version = "7.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation" }, @@ -1381,9 +1234,9 @@ dependencies = [ { name = "requests" }, { name = "requests-oauthlib" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/a0/c3e4894d833692f8693351d77a82631d907f26b5ea2bf64a72186141fba1/slims-python-api-6.9.0.tar.gz", hash = "sha256:195c6b30520425d75dea7ab8d326e59a2125efcd8d14cc966d5cfade93712265", size = 21087 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/21/62fb94273fa5708681de873f0b91bf1dfedde59700e2259052403dc66e62/slims_python_api-7.2.0.tar.gz", hash = "sha256:2dc23bbf7d20ddf0d712a622f34fc4341b3df8b099d0ced111b532b1f4694634", size = 21349 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/6a/223b7fec5f5a9552c894d9600db5df78589be5d7639dd9cb815a05863009/slims_python_api-6.9.0-py2.py3-none-any.whl", hash = "sha256:15ddc0fc5da62329d2a4fd8cae2f5349202cd09aead90593a67e54d3c86e4798", size = 17005 }, + { url = "https://files.pythonhosted.org/packages/77/1f/938934b209e2a09f9c7a31015218449d2e3eb8c0c29d713c858822c1352f/slims_python_api-7.2.0-py2.py3-none-any.whl", hash = "sha256:88e13e24e0612a55964cdc1f11ba56c47e8befc3ea3ab526e4fc19d622bcab2e", size = 17144 }, ] [[package]] @@ -1557,11 +1410,11 @@ wheels = [ [[package]] name = "threadpoolctl" -version = "3.5.0" +version = "3.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b5148dcbf72f5cde221f8bfe3b6a540da7aa1842f6b491ad979a6c8b84af/threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107", size = 41936 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467", size = 18414 }, + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, ] [[package]] @@ -1575,7 +1428,7 @@ wheels = [ [[package]] name = "typer" -version = "0.15.1" +version = "0.15.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1583,9 +1436,9 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 }, + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, ] [[package]] @@ -1612,23 +1465,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 }, -] - -[[package]] -name = "tzlocal" -version = "5.3" +version = "2025.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/cc/11360404b20a6340b9b4ed39a3338c4af47bc63f87f6cea94dbcbde07029/tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2", size = 30480 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/9f/1c0b69d3abf4c65acac051ad696b8aea55afbb746dea8017baab53febb5e/tzlocal-5.3-py3-none-any.whl", hash = "sha256:3814135a1bb29763c6e4f08fd6e41dbb435c7a60bfbb03270211bcc537187d8c", size = 17920 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] [[package]] @@ -1640,33 +1481,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] -[[package]] -name = "watchdog" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, -] - [[package]] name = "werkzeug" version = "3.1.3" From cae11d42597d3281f44fa9b5a2d56d860698f41a Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:02:06 -0700 Subject: [PATCH 02/32] Update to latest standard of Aind.BehaviorServices --- .config/dotnet-tools.json | 2 +- clabe_default.yml | 2 - docs/conf.py | 9 +- examples/examples.py | 7 +- pyproject.toml | 43 +- ...ig.json => aind_behavior_just_frames.json} | 438 +++- .../aind_behavior_session_model.json | 110 - .../__init__.py | 1 - .../launcher.py | 82 - .../regenerate.py | 42 - .../task_logic.py | 25 - ..._video_encoding_benchmarks_task_logic.json | 79 - ...cs => AindBehaviorJustFrames.Generated.cs} | 1364 +++++++++--- src/Extensions/AindBehaviorSessionModel.cs | 379 ---- .../AindVideoEncodingBenchmarksTaskLogic.cs | 325 --- src/Extensions/TriggeredCamerasLogger.bonsai | 2 +- src/aind_behavior_just_frames/__init__.py | 30 + src/aind_behavior_just_frames/cli.py | 44 + src/aind_behavior_just_frames/launcher.py | 25 + src/aind_behavior_just_frames/regenerate.py | 34 + .../rig.py | 19 +- src/main.bonsai | 6 +- src/test_deserialization.bonsai | 6 +- tests/test_bonsai.py | 9 +- uv.lock | 1924 ++++++++++------- 25 files changed, 2734 insertions(+), 2273 deletions(-) delete mode 100644 clabe_default.yml rename src/DataSchemas/{aind_video_encoding_benchmarks_rig.json => aind_behavior_just_frames.json} (59%) delete mode 100644 src/DataSchemas/aind_behavior_session_model.json delete mode 100644 src/DataSchemas/aind_behavior_video_encoding_benchmarks/__init__.py delete mode 100644 src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py delete mode 100644 src/DataSchemas/aind_behavior_video_encoding_benchmarks/regenerate.py delete mode 100644 src/DataSchemas/aind_behavior_video_encoding_benchmarks/task_logic.py delete mode 100644 src/DataSchemas/aind_video_encoding_benchmarks_task_logic.json rename src/Extensions/{AindVideoEncodingBenchmarksRig.cs => AindBehaviorJustFrames.Generated.cs} (65%) delete mode 100644 src/Extensions/AindBehaviorSessionModel.cs delete mode 100644 src/Extensions/AindVideoEncodingBenchmarksTaskLogic.cs create mode 100644 src/aind_behavior_just_frames/__init__.py create mode 100644 src/aind_behavior_just_frames/cli.py create mode 100644 src/aind_behavior_just_frames/launcher.py create mode 100644 src/aind_behavior_just_frames/regenerate.py rename src/{DataSchemas/aind_behavior_video_encoding_benchmarks => aind_behavior_just_frames}/rig.py (50%) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index d5d9d94..44b1c27 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "bonsai.sgen": { - "version": "0.3.0", + "version": "0.6.1", "commands": [ "bonsai.sgen" ] diff --git a/clabe_default.yml b/clabe_default.yml deleted file mode 100644 index c04e48d..0000000 --- a/clabe_default.yml +++ /dev/null @@ -1,2 +0,0 @@ -data_dir: C:/Data -subject: "123456" \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index d09e9a9..bfc27f7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,13 +6,14 @@ import os import sys -import aind_behavior_video_encoding_benchmarks.rig -import aind_behavior_video_encoding_benchmarks.task_logic +import aind_behavior_just_frames.task_logic import erdantic as erd from pydantic import BaseModel +import aind_behavior_just_frames.rig + sys.path.insert(0, os.path.abspath("../src/DataSchemas")) -import aind_behavior_video_encoding_benchmarks +import aind_behavior_just_frames SOURCE_ROOT = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VideoEncodingBenchmarks/tree/main/src/DataSchemas/" @@ -22,7 +23,7 @@ project = "AIND Video Encoding Benchmarks project" copyright = "2024, Allen Institute for Neural Dynamics" author = "Bruno Cruz" -release = aind_behavior_video_encoding_benchmarks.__version__ +release = aind_behavior_just_frames.__semver__ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/examples/examples.py b/examples/examples.py index 1435a94..f083223 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -2,12 +2,13 @@ import os import aind_behavior_services.rig as rig -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_video_encoding_benchmarks.rig import AindVideoEncodingBenchmarksRig -from aind_behavior_video_encoding_benchmarks.task_logic import ( +from aind_behavior_just_frames.task_logic import ( AindVideoEncodingBenchmarksTaskLogic, AindVideoEncodingBenchmarksTaskParameters, ) +from aind_behavior_services.session import AindBehaviorSessionModel + +from aind_behavior_just_frames.rig import AindVideoEncodingBenchmarksRig def main(path_seed: str = "./local/{schema}.json"): diff --git a/pyproject.toml b/pyproject.toml index 4d826e2..08a6eb9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,51 +1,48 @@ [build-system] -requires = ["setuptools", "setuptools-scm"] -build-backend = "setuptools.build_meta" +requires = ["uv_build>=0.8.22"] +build-backend = "uv_build" [project] -name = "aind-behavior-video-encoding-benchmarks" +name = "aind-behavior-just_frames" description = "A library for benchmarking online video acquisition/encoding pipelines" +authors = [ {name = "Bruno Cruz", email = "bruno.cruz@alleninstitute.org"}] license = {text = "MIT"} requires-python = ">=3.11" classifiers = [ - "Programming Language :: Python :: 3" + "Programming Language :: Python :: 3.11", + "Operating System :: Microsoft :: Windows", ] -readme = "README.md" -dynamic = ["version"] +version = "0.5.0rc0" +readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.10, <0.11", + "aind_behavior_services>=0.12, <0.13", + "pydantic-settings" ] [project.optional-dependencies] -launcher = ["aind_behavior_experiment_launcher[aind-services]"] +launcher = ["aind-clabe[aind-services] >= 0.8.2 ,<0.9.0"] -dev = ["aind_behavior_video_encoding_benchmarks[launcher]", + +[dependency-groups] + +dev = ["aind_behavior_just_frames[launcher]", "ruff", "codespell" ] - docs = [ - 'Sphinx<7.3', + 'Sphinx', 'furo', 'sphinx-jinja', 'autodoc_pydantic[erdantic]', 'myst_parser', - 'sphinx-jsonschema' + 'sphinx-jsonschema', ] [project.scripts] -clabe = "aind_behavior_video_encoding_benchmarks.launcher:main" -regenerate = "aind_behavior_video_encoding_benchmarks.regenerate:main" - -[tool.setuptools.packages.find] -where = ["src/DataSchemas"] - -[tool.setuptools.dynamic] -version = {attr = "aind_behavior_video_encoding_benchmarks.__version__"} -readme = {file = ["README.md"]} +just-frames = "aind_behavior_just_frames.cli:main" [tool.ruff] line-length = 120 @@ -60,3 +57,7 @@ pydocstyle = { convention = 'google' } [tool.codespell] skip = '.git,*.pdf,*.svg' ignore-words-list = 'nd' + +[tool.uv] +default-groups = ['dev'] +required-version = '>=0.8.4' \ No newline at end of file diff --git a/src/DataSchemas/aind_video_encoding_benchmarks_rig.json b/src/DataSchemas/aind_behavior_just_frames.json similarity index 59% rename from src/DataSchemas/aind_video_encoding_benchmarks_rig.json rename to src/DataSchemas/aind_behavior_just_frames.json index 94df6d7..785f362 100644 --- a/src/DataSchemas/aind_video_encoding_benchmarks_rig.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -1,5 +1,195 @@ { - "definitions": { + "$defs": { + "AindBehaviorSessionModel": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.12.3", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.12.3", + "default": "0.12.3", + "title": "Version", + "type": "string" + }, + "experiment": { + "default": null, + "description": "Name of the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Experiment" + }, + "experimenter": { + "default": [], + "description": "Name of the experimenter", + "items": { + "type": "string" + }, + "title": "Experimenter", + "type": "array" + }, + "date": { + "description": "Date of the experiment", + "format": "date-time", + "title": "Date", + "type": "string" + }, + "root_path": { + "description": "Root path where data will be logged", + "title": "Root Path", + "type": "string" + }, + "session_name": { + "default": null, + "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Name" + }, + "subject": { + "description": "Name of the subject", + "title": "Subject", + "type": "string" + }, + "experiment_version": { + "default": "", + "deprecated": true, + "description": "Version of the experiment", + "title": "Experiment Version", + "type": "string" + }, + "notes": { + "default": null, + "description": "Notes about the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Notes" + }, + "commit_hash": { + "default": null, + "description": "Commit hash of the repository", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Hash" + }, + "allow_dirty_repo": { + "default": false, + "description": "Allow running from a dirty repository", + "title": "Allow Dirty Repo", + "type": "boolean" + }, + "skip_hardware_validation": { + "default": false, + "description": "Skip hardware validation", + "title": "Skip Hardware Validation", + "type": "boolean" + } + }, + "required": [ + "root_path", + "subject" + ], + "title": "AindBehaviorSessionModel", + "type": "object" + }, + "AindJustFramesRig": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.12.3", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.5.0-rc0", + "default": "0.5.0-rc0", + "title": "Version", + "type": "string" + }, + "computer_name": { + "description": "Computer name", + "title": "Computer Name", + "type": "string" + }, + "rig_name": { + "description": "Rig name", + "title": "Rig Name", + "type": "string" + }, + "triggered_camera_controller_0": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "triggered_camera_controller_1": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera1 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "harp_behavior": { + "$ref": "#/$defs/HarpBehavior", + "description": "Harp behavior board. Will be the source of triggers for the two camera controllers." + }, + "harp_white_rabbit": { + "default": null, + "description": "Harp White Rabbit for time synchronization.", + "oneOf": [ + { + "$ref": "#/$defs/HarpWhiteRabbit" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rig_name", + "harp_behavior" + ], + "title": "AindJustFramesRig", + "type": "object" + }, "BaseModel": { "properties": {}, "title": "BaseModel", @@ -13,12 +203,25 @@ "title": "Device Type", "type": "string" }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, "additional_settings": { "default": null, "description": "Additional settings", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -30,7 +233,7 @@ "description": "Calibration", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -39,7 +242,7 @@ }, "cameras": { "additionalProperties": { - "$ref": "#/definitions/SpinnakerCamera" + "$ref": "#/$defs/SpinnakerCamera" }, "description": "Cameras to be instantiated", "title": "Cameras", @@ -66,6 +269,34 @@ "title": "CameraController[SpinnakerCamera]", "type": "object" }, + "ConnectedClockOutput": { + "properties": { + "target_device": { + "default": null, + "description": "Optional device name to provide user additional information", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Target Device" + }, + "output_channel": { + "description": "Output channel", + "minimum": 0, + "title": "Output Channel", + "type": "integer" + } + }, + "required": [ + "output_channel" + ], + "title": "ConnectedClockOutput", + "type": "object" + }, "HarpBehavior": { "properties": { "device_type": { @@ -74,12 +305,25 @@ "title": "Device Type", "type": "string" }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, "additional_settings": { "default": null, "description": "Additional settings", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -91,7 +335,7 @@ "description": "Calibration", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -129,6 +373,91 @@ "title": "HarpBehavior", "type": "object" }, + "HarpWhiteRabbit": { + "properties": { + "device_type": { + "const": "WhiteRabbit", + "default": "WhiteRabbit", + "title": "Device Type", + "type": "string" + }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, + "additional_settings": { + "default": null, + "description": "Additional settings", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "calibration": { + "default": null, + "description": "Calibration", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "who_am_i": { + "const": 1404, + "default": 1404, + "title": "Who Am I", + "type": "integer" + }, + "serial_number": { + "default": null, + "description": "Device serial number", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Serial Number" + }, + "port_name": { + "description": "Device port name", + "title": "Port Name", + "type": "string" + }, + "connected_clock_outputs": { + "default": [], + "description": "Connected clock outputs", + "items": { + "$ref": "#/$defs/ConnectedClockOutput" + }, + "title": "Connected Clock Outputs", + "type": "array" + } + }, + "required": [ + "port_name" + ], + "title": "HarpWhiteRabbit", + "type": "object" + }, "Rect": { "properties": { "x": { @@ -172,12 +501,25 @@ "title": "Device Type", "type": "string" }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, "additional_settings": { "default": null, "description": "Additional settings", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -189,7 +531,7 @@ "description": "Calibration", "oneOf": [ { - "$ref": "#/definitions/BaseModel" + "$ref": "#/$defs/BaseModel" }, { "type": "null" @@ -228,7 +570,7 @@ "gain": { "default": 0, "description": "Gain", - "minimum": 0.0, + "minimum": 0, "title": "Gain", "type": "number" }, @@ -237,7 +579,7 @@ "description": "Gamma. If None, will disable gamma correction.", "oneOf": [ { - "minimum": 0.0, + "minimum": 0, "type": "number" }, { @@ -251,7 +593,7 @@ "description": "ADC bit depth. If None will be left as default.", "oneOf": [ { - "$ref": "#/definitions/SpinnakerCameraAdcBitDepth" + "$ref": "#/$defs/SpinnakerCameraAdcBitDepth" }, { "type": "null" @@ -263,7 +605,7 @@ "description": "Pixel format. If None will be left as default.", "oneOf": [ { - "$ref": "#/definitions/SpinnakerCameraPixelFormat" + "$ref": "#/$defs/SpinnakerCameraPixelFormat" }, { "type": "null" @@ -271,7 +613,7 @@ ] }, "region_of_interest": { - "$ref": "#/definitions/Rect", + "$ref": "#/$defs/Rect", "default": { "x": 0, "y": 0, @@ -285,7 +627,7 @@ "description": "Video writer. If not provided, no video will be saved.", "oneOf": [ { - "$ref": "#/definitions/VideoWriter" + "$ref": "#/$defs/VideoWriter" }, { "type": "null" @@ -612,17 +954,17 @@ "VideoWriter": { "discriminator": { "mapping": { - "FFMPEG": "#/definitions/VideoWriterFfmpeg", - "OPENCV": "#/definitions/VideoWriterOpenCv" + "FFMPEG": "#/$defs/VideoWriterFfmpeg", + "OPENCV": "#/$defs/VideoWriterOpenCv" }, "propertyName": "video_writer_type" }, "oneOf": [ { - "$ref": "#/definitions/VideoWriterFfmpeg" + "$ref": "#/$defs/VideoWriterFfmpeg" }, { - "$ref": "#/definitions/VideoWriterOpenCv" + "$ref": "#/$defs/VideoWriterOpenCv" } ] }, @@ -694,63 +1036,5 @@ "title": "VideoWriterOpenCv", "type": "object" } - }, - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.10.2", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "version": { - "const": "0.2.1", - "default": "0.2.1", - "title": "Version", - "type": "string" - }, - "computer_name": { - "description": "Computer name", - "title": "Computer Name", - "type": "string" - }, - "rig_name": { - "description": "Rig name", - "title": "Rig Name", - "type": "string" - }, - "triggered_camera_controller_0": { - "default": null, - "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", - "oneOf": [ - { - "$ref": "#/definitions/CameraController_SpinnakerCamera_" - }, - { - "type": "null" - } - ] - }, - "triggered_camera_controller_1": { - "default": null, - "description": "Camera controller to triggered cameras. Will use Camera1 register as a trigger.", - "oneOf": [ - { - "$ref": "#/definitions/CameraController_SpinnakerCamera_" - }, - { - "type": "null" - } - ] - }, - "harp_behavior": { - "$ref": "#/definitions/HarpBehavior", - "description": "Harp behavior board. Will be the source of triggers for the two camera controllers." - } - }, - "required": [ - "rig_name", - "harp_behavior" - ], - "title": "AindVideoEncodingBenchmarksRig", - "type": "object" + } } \ No newline at end of file diff --git a/src/DataSchemas/aind_behavior_session_model.json b/src/DataSchemas/aind_behavior_session_model.json deleted file mode 100644 index 09966ba..0000000 --- a/src/DataSchemas/aind_behavior_session_model.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.10.2", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "version": { - "const": "0.3.1", - "default": "0.3.1", - "title": "Version", - "type": "string" - }, - "experiment": { - "description": "Name of the experiment", - "title": "Experiment", - "type": "string" - }, - "experimenter": { - "default": [], - "description": "Name of the experimenter", - "items": { - "type": "string" - }, - "title": "Experimenter", - "type": "array" - }, - "date": { - "description": "Date of the experiment", - "format": "date-time", - "title": "Date", - "type": "string" - }, - "root_path": { - "description": "Root path where data will be logged", - "title": "Root Path", - "type": "string" - }, - "session_name": { - "default": null, - "description": "Name of the session. This will be used to create a folder in the root path.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Name" - }, - "subject": { - "description": "Name of the subject", - "title": "Subject", - "type": "string" - }, - "experiment_version": { - "description": "Version of the experiment", - "title": "Experiment Version", - "type": "string" - }, - "notes": { - "default": null, - "description": "Notes about the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - }, - "commit_hash": { - "default": null, - "description": "Commit hash of the repository", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Commit Hash" - }, - "allow_dirty_repo": { - "default": false, - "description": "Allow running from a dirty repository", - "title": "Allow Dirty Repo", - "type": "boolean" - }, - "skip_hardware_validation": { - "default": false, - "description": "Skip hardware validation", - "title": "Skip Hardware Validation", - "type": "boolean" - } - }, - "required": [ - "experiment", - "root_path", - "subject", - "experiment_version" - ], - "title": "AindBehaviorSessionModel", - "type": "object" -} \ No newline at end of file diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/__init__.py b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/__init__.py deleted file mode 100644 index 6a9beea..0000000 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.4.0" diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py deleted file mode 100644 index ab1bcbc..0000000 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/launcher.py +++ /dev/null @@ -1,82 +0,0 @@ -import logging -from pathlib import Path -from typing import final - -import aind_behavior_experiment_launcher.launcher.behavior_launcher as behavior_launcher -from aind_behavior_experiment_launcher.apps import AindBehaviorServicesBonsaiApp -from aind_behavior_experiment_launcher.launcher.behavior_launcher import DefaultBehaviorPicker -from aind_behavior_experiment_launcher.resource_monitor import ( - ResourceMonitor, - available_storage_constraint_factory, - remote_dir_exists_constraint_factory, -) -from aind_behavior_experiment_launcher.ui import prompt_field_from_input -from aind_behavior_services.session import AindBehaviorSessionModel -from pydantic import ValidationError -from pydantic_settings import CliApp -from typing_extensions import override - -from aind_behavior_video_encoding_benchmarks.rig import AindVideoEncodingBenchmarksRig -from aind_behavior_video_encoding_benchmarks.task_logic import ( - AindVideoEncodingBenchmarksTaskLogic, - AindVideoEncodingBenchmarksTaskParameters, -) - -logger = logging.getLogger(__name__) - - -@final -class _CustomPicker(DefaultBehaviorPicker): - @override - def pick_task_logic(self) -> AindVideoEncodingBenchmarksTaskLogic: - save_raw = None - while save_raw is None: - try: - save_raw = prompt_field_from_input( - AindVideoEncodingBenchmarksTaskParameters, "save_raw_video", default=False - ) - except ValidationError as e: - self.launcher._logger.error("Failed to parse input: %s", e) - else: - self.launcher._logger.info("save_raw_video set to: %s", save_raw) - return AindVideoEncodingBenchmarksTaskLogic( - task_parameters=AindVideoEncodingBenchmarksTaskParameters(save_raw_video=save_raw) - ) - - -def make_launcher(settings: behavior_launcher.BehaviorCliArgs) -> behavior_launcher.BehaviorLauncher: - data_dir = settings.data_dir - remote_dir = Path(r"\\allen\aind\scratch\video-encoding-benchmarks\data") - srv = behavior_launcher.BehaviorServicesFactoryManager() - srv.attach_app(AindBehaviorServicesBonsaiApp(Path(r"./src/main.bonsai"))) - srv.attach_data_transfer(behavior_launcher.robocopy_data_transfer_factory(Path(remote_dir))) - srv.attach_resource_monitor( - ResourceMonitor( - constrains=[ - available_storage_constraint_factory(Path(data_dir), 2e11), - remote_dir_exists_constraint_factory(Path(remote_dir)), - ] - ) - ) - - return behavior_launcher.BehaviorLauncher( - rig_schema_model=AindVideoEncodingBenchmarksRig, - session_schema_model=AindBehaviorSessionModel, - task_logic_schema_model=AindVideoEncodingBenchmarksTaskLogic, - picker=_CustomPicker( - config_library_dir=Path(r"\\allen\aind\scratch\AindBehavior.db\AindVideoEncodingBenchmarks") - ), - settings=settings, - services=srv, - ) - - -def main(): - args = CliApp().run(behavior_launcher.BehaviorCliArgs) - launcher = make_launcher(args) - launcher.main() - return None - - -if __name__ == "__main__": - main() diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/regenerate.py b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/regenerate.py deleted file mode 100644 index 87e0ddc..0000000 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/regenerate.py +++ /dev/null @@ -1,42 +0,0 @@ -import inspect -from pathlib import Path - -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_services.utils import ( - convert_pydantic_to_bonsai, - pascal_to_snake_case, - snake_to_pascal_case, -) - -import aind_behavior_video_encoding_benchmarks.rig -import aind_behavior_video_encoding_benchmarks.task_logic - -SCHEMA_ROOT = Path("./src/DataSchemas/") -EXTENSIONS_ROOT = Path("./src/Extensions/") -NAMESPACE_PREFIX = "AindVideoEncodingBenchmarksSchemas" - - -def main(): - models = [ - aind_behavior_video_encoding_benchmarks.task_logic.AindVideoEncodingBenchmarksTaskLogic, - aind_behavior_video_encoding_benchmarks.rig.AindVideoEncodingBenchmarksRig, - AindBehaviorSessionModel, - ] - - for model in models: - module_name = inspect.getmodule(model).__name__ - module_name = module_name.split(".")[-1] - schema_name = f"{pascal_to_snake_case(model.__name__)}" - namespace = f"{NAMESPACE_PREFIX}.{snake_to_pascal_case(module_name)}" - - print((schema_name, namespace)) - convert_pydantic_to_bonsai( - {schema_name: model}, - schema_path=SCHEMA_ROOT, - output_path=EXTENSIONS_ROOT, - namespace=namespace, - ) - - -if __name__ == "__main__": - main() diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/task_logic.py b/src/DataSchemas/aind_behavior_video_encoding_benchmarks/task_logic.py deleted file mode 100644 index 97f5abe..0000000 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/task_logic.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from typing import Literal - -from aind_behavior_services.task_logic import AindBehaviorTaskLogicModel, TaskParameters -from pydantic import Field - -__version__ = "0.1.1" - - -class AindVideoEncodingBenchmarksTaskParameters(TaskParameters): - save_raw_video: bool = Field( - default=False, - description="For each video-writer object, will also save the RAW encoded video to disk. Use at your own risk.", - ) - - -class AindVideoEncodingBenchmarksTaskLogic(AindBehaviorTaskLogicModel): - version: Literal[__version__] = __version__ - name: str = Field( - default="AindVideoEncodingBenchmarks", - description="Name of the task logic", - frozen=True, - ) - task_parameters: AindVideoEncodingBenchmarksTaskParameters = Field(..., description="Parameters of the task logic") diff --git a/src/DataSchemas/aind_video_encoding_benchmarks_task_logic.json b/src/DataSchemas/aind_video_encoding_benchmarks_task_logic.json deleted file mode 100644 index 288b4c5..0000000 --- a/src/DataSchemas/aind_video_encoding_benchmarks_task_logic.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "definitions": { - "AindVideoEncodingBenchmarksTaskParameters": { - "additionalProperties": true, - "properties": { - "rng_seed": { - "default": null, - "description": "Seed of the random number generator", - "oneOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Rng Seed" - }, - "aind_behavior_services_pkg_version": { - "default": "0.10.2", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "save_raw_video": { - "default": false, - "description": "For each video-writer object, will also save the RAW encoded video to disk. Use at your own risk.", - "title": "Save Raw Video", - "type": "boolean" - } - }, - "title": "AindVideoEncodingBenchmarksTaskParameters", - "type": "object" - } - }, - "additionalProperties": false, - "properties": { - "name": { - "default": "AindVideoEncodingBenchmarks", - "description": "Name of the task logic", - "title": "Name", - "type": "string" - }, - "description": { - "default": "", - "description": "Description of the task.", - "title": "Description", - "type": "string" - }, - "task_parameters": { - "$ref": "#/definitions/AindVideoEncodingBenchmarksTaskParameters", - "description": "Parameters of the task logic" - }, - "version": { - "const": "0.1.1", - "default": "0.1.1", - "title": "Version", - "type": "string" - }, - "stage_name": { - "default": null, - "description": "Optional stage name the `Task` object instance represents.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Stage Name" - } - }, - "required": [ - "task_parameters" - ], - "title": "AindVideoEncodingBenchmarksTaskLogic", - "type": "object" -} \ No newline at end of file diff --git a/src/Extensions/AindVideoEncodingBenchmarksRig.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs similarity index 65% rename from src/Extensions/AindVideoEncodingBenchmarksRig.cs rename to src/Extensions/AindBehaviorJustFrames.Generated.cs index 27012ba..38d9208 100644 --- a/src/Extensions/AindVideoEncodingBenchmarksRig.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -5,13 +5,543 @@ //---------------------- -namespace AindVideoEncodingBenchmarksSchemas.Rig +namespace AindJustFramesSchemas { #pragma warning disable // Disable all warnings - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindBehaviorSessionModel + { + + private string _aindBehaviorServicesPkgVersion; + + private string _version; + + private string _experiment; + + private System.Collections.Generic.List _experimenter; + + private System.DateTimeOffset _date; + + private string _rootPath; + + private string _sessionName; + + private string _subject; + + private string _experimentVersion; + + private string _notes; + + private string _commitHash; + + private bool _allowDirtyRepo; + + private bool _skipHardwareValidation; + + public AindBehaviorSessionModel() + { + _aindBehaviorServicesPkgVersion = "0.12.3"; + _version = "0.12.3"; + _experimenter = new System.Collections.Generic.List(); + _experimentVersion = ""; + _allowDirtyRepo = false; + _skipHardwareValidation = false; + } + + protected AindBehaviorSessionModel(AindBehaviorSessionModel other) + { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _experiment = other._experiment; + _experimenter = other._experimenter; + _date = other._date; + _rootPath = other._rootPath; + _sessionName = other._sessionName; + _subject = other._subject; + _experimentVersion = other._experimentVersion; + _notes = other._notes; + _commitHash = other._commitHash; + _allowDirtyRepo = other._allowDirtyRepo; + _skipHardwareValidation = other._skipHardwareValidation; + } + + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; + } + } + + /// + /// Name of the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("experiment")] + [System.ComponentModel.DescriptionAttribute("Name of the experiment")] + public string Experiment + { + get + { + return _experiment; + } + set + { + _experiment = value; + } + } + + /// + /// Name of the experimenter + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] + [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] + public System.Collections.Generic.List Experimenter + { + get + { + return _experimenter; + } + set + { + _experimenter = value; + } + } + + /// + /// Date of the experiment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the experiment")] + public System.DateTimeOffset Date + { + get + { + return _date; + } + set + { + _date = value; + } + } + + /// + /// Root path where data will be logged + /// + [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] + public string RootPath + { + get + { + return _rootPath; + } + set + { + _rootPath = value; + } + } + + /// + /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. + /// + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + + "t provided, it will be generated using subject and date.")] + public string SessionName + { + get + { + return _sessionName; + } + set + { + _sessionName = value; + } + } + + /// + /// Name of the subject + /// + [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Name of the subject")] + public string Subject + { + get + { + return _subject; + } + set + { + _subject = value; + } + } + + /// + /// Version of the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] + [System.ComponentModel.DescriptionAttribute("Version of the experiment")] + public string ExperimentVersion + { + get + { + return _experimentVersion; + } + set + { + _experimentVersion = value; + } + } + + /// + /// Notes about the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] + public string Notes + { + get + { + return _notes; + } + set + { + _notes = value; + } + } + + /// + /// Commit hash of the repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] + [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] + public string CommitHash + { + get + { + return _commitHash; + } + set + { + _commitHash = value; + } + } + + /// + /// Allow running from a dirty repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] + [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] + public bool AllowDirtyRepo + { + get + { + return _allowDirtyRepo; + } + set + { + _allowDirtyRepo = value; + } + } + + /// + /// Skip hardware validation + /// + [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] + [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] + public bool SkipHardwareValidation + { + get + { + return _skipHardwareValidation; + } + set + { + _skipHardwareValidation = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("Experiment = " + _experiment + ", "); + stringBuilder.Append("Experimenter = " + _experimenter + ", "); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("RootPath = " + _rootPath + ", "); + stringBuilder.Append("SessionName = " + _sessionName + ", "); + stringBuilder.Append("Subject = " + _subject + ", "); + stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); + stringBuilder.Append("Notes = " + _notes + ", "); + stringBuilder.Append("CommitHash = " + _commitHash + ", "); + stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); + stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindJustFramesRig + { + + private string _aindBehaviorServicesPkgVersion; + + private string _version; + + private string _computerName; + + private string _rigName; + + private CameraControllerSpinnakerCamera _triggeredCameraController0; + + private CameraControllerSpinnakerCamera _triggeredCameraController1; + + private HarpBehavior _harpBehavior; + + private HarpWhiteRabbit _harpWhiteRabbit; + + public AindJustFramesRig() + { + _aindBehaviorServicesPkgVersion = "0.12.3"; + _version = "0.5.0-rc0"; + _harpBehavior = new HarpBehavior(); + } + + protected AindJustFramesRig(AindJustFramesRig other) + { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _computerName = other._computerName; + _rigName = other._rigName; + _triggeredCameraController0 = other._triggeredCameraController0; + _triggeredCameraController1 = other._triggeredCameraController1; + _harpBehavior = other._harpBehavior; + _harpWhiteRabbit = other._harpWhiteRabbit; + } + + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; + } + } + + /// + /// Computer name + /// + [Newtonsoft.Json.JsonPropertyAttribute("computer_name")] + [System.ComponentModel.DescriptionAttribute("Computer name")] + public string ComputerName + { + get + { + return _computerName; + } + set + { + _computerName = value; + } + } + + /// + /// Rig name + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rig name")] + public string RigName + { + get + { + return _rigName; + } + set + { + _rigName = value; + } + } + + /// + /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_0")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera0 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController0 + { + get + { + return _triggeredCameraController0; + } + set + { + _triggeredCameraController0 = value; + } + } + + /// + /// Camera controller to triggered cameras. Will use Camera1 register as a trigger. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_1")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera1 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController1 + { + get + { + return _triggeredCameraController1; + } + set + { + _triggeredCameraController1 = value; + } + } + + /// + /// Harp behavior board. Will be the source of triggers for the two camera controllers. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_behavior", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp behavior board. Will be the source of triggers for the two camera controller" + + "s.")] + public HarpBehavior HarpBehavior + { + get + { + return _harpBehavior; + } + set + { + _harpBehavior = value; + } + } + + /// + /// Harp White Rabbit for time synchronization. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_white_rabbit")] + [System.ComponentModel.DescriptionAttribute("Harp White Rabbit for time synchronization.")] + public HarpWhiteRabbit HarpWhiteRabbit + { + get + { + return _harpWhiteRabbit; + } + set + { + _harpWhiteRabbit = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindJustFramesRig(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new AindJustFramesRig(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("ComputerName = " + _computerName + ", "); + stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); + stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); + stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); + stringBuilder.Append("HarpWhiteRabbit = " + _harpWhiteRabbit); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class BaseModel { @@ -23,12 +553,12 @@ protected BaseModel(BaseModel other) { } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); } @@ -53,29 +583,34 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class CameraControllerSpinnakerCamera { - private string _deviceType = "CameraController"; + private string _deviceType; + + private string _deviceName; private BaseModel _additionalSettings; private BaseModel _calibration; - private System.Collections.Generic.IDictionary _cameras = new System.Collections.Generic.Dictionary(); + private System.Collections.Generic.Dictionary _cameras; private int? _frameRate; public CameraControllerSpinnakerCamera() { + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); } protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { _deviceType = other._deviceType; + _deviceName = other._deviceName; _additionalSettings = other._additionalSettings; _calibration = other._calibration; _cameras = other._cameras; @@ -95,6 +630,23 @@ public string DeviceType } } + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + /// /// Additional settings /// @@ -137,53 +689,327 @@ public BaseModel Calibration [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.IDictionary Cameras + public System.Collections.Generic.Dictionary Cameras + { + get + { + return _cameras; + } + set + { + _cameras = value; + } + } + + /// + /// Frame rate of the trigger to all cameras + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ConnectedClockOutput + { + + private string _targetDevice; + + private int _outputChannel; + + public ConnectedClockOutput() + { + } + + protected ConnectedClockOutput(ConnectedClockOutput other) + { + _targetDevice = other._targetDevice; + _outputChannel = other._outputChannel; + } + + /// + /// Optional device name to provide user additional information + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_device")] + [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] + public string TargetDevice + { + get + { + return _targetDevice; + } + set + { + _targetDevice = value; + } + } + + /// + /// Output channel + /// + [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Output channel")] + public int OutputChannel + { + get + { + return _outputChannel; + } + set + { + _outputChannel = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); + stringBuilder.Append("OutputChannel = " + _outputChannel); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class HarpBehavior + { + + private string _deviceType; + + private string _deviceName; + + private BaseModel _additionalSettings; + + private BaseModel _calibration; + + private int _whoAmI; + + private string _serialNumber; + + private string _portName; + + public HarpBehavior() + { + _deviceType = "Behavior"; + _whoAmI = 1216; + } + + protected HarpBehavior(HarpBehavior other) + { + _deviceType = other._deviceType; + _deviceName = other._deviceName; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; + } + } + + /// + /// Device serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _cameras; + return _serialNumber; } set { - _cameras = value; + _serialNumber = value; } } /// - /// Frame rate of the trigger to all cameras + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _frameRate; + return _portName; } set { - _frameRate = value; + _portName = value; } } - public System.IObservable Process() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("cameras = " + _cameras + ", "); - stringBuilder.Append("frame_rate = " + _frameRate); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -202,36 +1028,45 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpBehavior + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class HarpWhiteRabbit { - private string _deviceType = "Behavior"; + private string _deviceType; + + private string _deviceName; private BaseModel _additionalSettings; private BaseModel _calibration; - private int _whoAmI = 1216; + private int _whoAmI; private string _serialNumber; private string _portName; - public HarpBehavior() + private System.Collections.Generic.List _connectedClockOutputs; + + public HarpWhiteRabbit() { + _deviceType = "WhiteRabbit"; + _whoAmI = 1404; + _connectedClockOutputs = new System.Collections.Generic.List(); } - protected HarpBehavior(HarpBehavior other) + protected HarpWhiteRabbit(HarpWhiteRabbit other) { _deviceType = other._deviceType; + _deviceName = other._deviceName; _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; _portName = other._portName; + _connectedClockOutputs = other._connectedClockOutputs; } [Newtonsoft.Json.JsonPropertyAttribute("device_type")] @@ -247,6 +1082,23 @@ public string DeviceType } } + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + /// /// Additional settings /// @@ -330,24 +1182,44 @@ public string PortName } } - public System.IObservable Process() + /// + /// Connected clock outputs + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] + [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] + public System.Collections.Generic.List ConnectedClockOutputs { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); + get + { + return _connectedClockOutputs; + } + set + { + _connectedClockOutputs = value; + } } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("who_am_i = " + _whoAmI + ", "); - stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("port_name = " + _portName); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName + ", "); + stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); return true; } @@ -366,22 +1238,26 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Rect { - private int _x = 0; + private int _x; - private int _y = 0; + private int _y; - private int _width = 0; + private int _width; - private int _height = 0; + private int _height; public Rect() { + _x = 0; + _y = 0; + _width = 0; + _height = 0; } protected Rect(Rect other) @@ -460,22 +1336,22 @@ public int Height } } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("x = " + _x + ", "); - stringBuilder.Append("y = " + _y + ", "); - stringBuilder.Append("width = " + _width + ", "); - stringBuilder.Append("height = " + _height); + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); return true; } @@ -494,13 +1370,15 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class SpinnakerCamera { - private string _deviceType = "SpinnakerCamera"; + private string _deviceType; + + private string _deviceName; private BaseModel _additionalSettings; @@ -508,19 +1386,19 @@ public partial class SpinnakerCamera private string _serialNumber; - private int _binning = 1; + private int _binning; - private SpinnakerCameraColorProcessing _colorProcessing = AindVideoEncodingBenchmarksSchemas.Rig.SpinnakerCameraColorProcessing.Default; + private SpinnakerCameraColorProcessing _colorProcessing; - private int _exposure = 1000; + private int _exposure; - private double _gain = 0D; + private double _gain; private double? _gamma; - private SpinnakerCameraAdcBitDepth? _adcBitDepth = AindVideoEncodingBenchmarksSchemas.Rig.SpinnakerCameraAdcBitDepth.Adc8bit; + private SpinnakerCameraAdcBitDepth? _adcBitDepth; - private SpinnakerCameraPixelFormat? _pixelFormat = AindVideoEncodingBenchmarksSchemas.Rig.SpinnakerCameraPixelFormat.Mono8; + private SpinnakerCameraPixelFormat? _pixelFormat; private Rect _regionOfInterest; @@ -528,11 +1406,20 @@ public partial class SpinnakerCamera public SpinnakerCamera() { + _deviceType = "SpinnakerCamera"; + _binning = 1; + _colorProcessing = AindJustFramesSchemas.SpinnakerCameraColorProcessing.Default; + _exposure = 1000; + _gain = 0D; + _adcBitDepth = AindJustFramesSchemas.SpinnakerCameraAdcBitDepth.Adc8bit; + _pixelFormat = AindJustFramesSchemas.SpinnakerCameraPixelFormat.Mono8; + _regionOfInterest = new Rect(); } protected SpinnakerCamera(SpinnakerCamera other) { _deviceType = other._deviceType; + _deviceName = other._deviceName; _additionalSettings = other._additionalSettings; _calibration = other._calibration; _serialNumber = other._serialNumber; @@ -564,6 +1451,23 @@ public string DeviceType } } + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + /// /// Additional settings /// @@ -776,31 +1680,32 @@ public VideoWriter VideoWriter } } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("binning = " + _binning + ", "); - stringBuilder.Append("color_processing = " + _colorProcessing + ", "); - stringBuilder.Append("exposure = " + _exposure + ", "); - stringBuilder.Append("gain = " + _gain + ", "); - stringBuilder.Append("gamma = " + _gamma + ", "); - stringBuilder.Append("adc_bit_depth = " + _adcBitDepth + ", "); - stringBuilder.Append("pixel_format = " + _pixelFormat + ", "); - stringBuilder.Append("region_of_interest = " + _regionOfInterest + ", "); - stringBuilder.Append("video_writer = " + _videoWriter); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("Binning = " + _binning + ", "); + stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); + stringBuilder.Append("Exposure = " + _exposure + ", "); + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("Gamma = " + _gamma + ", "); + stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); + stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); + stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); return true; } @@ -819,7 +1724,7 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraAdcBitDepth { @@ -834,7 +1739,7 @@ public enum SpinnakerCameraAdcBitDepth } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraPixelFormat { @@ -1272,12 +2177,12 @@ public enum SpinnakerCameraPixelFormat } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] - [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriter { @@ -1289,12 +2194,12 @@ protected VideoWriter(VideoWriter other) { } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); } @@ -1319,22 +2224,26 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterFfmpeg : VideoWriter { - private int _frameRate = 30; + private int _frameRate; - private string _containerExtension = "mp4"; + private string _containerExtension; - private string _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; + private string _outputArguments; - private string _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; + private string _inputArguments; public VideoWriterFfmpeg() { + _frameRate = 30; + _containerExtension = "mp4"; + _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; + _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; } protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : @@ -1414,12 +2323,12 @@ public string InputArguments } } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); } @@ -1430,29 +2339,32 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("frame_rate = " + _frameRate + ", "); - stringBuilder.Append("container_extension = " + _containerExtension + ", "); - stringBuilder.Append("output_arguments = " + _outputArguments + ", "); - stringBuilder.Append("input_arguments = " + _inputArguments); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); + stringBuilder.Append("InputArguments = " + _inputArguments); return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterOpenCv : VideoWriter { - private int _frameRate = 30; + private int _frameRate; - private string _containerExtension = "avi"; + private string _containerExtension; - private string _fourCc = "FMP4"; + private string _fourCc; public VideoWriterOpenCv() { + _frameRate = 30; + _containerExtension = "avi"; + _fourCc = "FMP4"; } protected VideoWriterOpenCv(VideoWriterOpenCv other) : @@ -1514,12 +2426,12 @@ public string FourCc } } - public System.IObservable Process() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); } @@ -1530,202 +2442,15 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("frame_rate = " + _frameRate + ", "); - stringBuilder.Append("container_extension = " + _containerExtension + ", "); - stringBuilder.Append("four_cc = " + _fourCc); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class AindVideoEncodingBenchmarksRig - { - - private string _aindBehaviorServicesPkgVersion = "0.10.2"; - - private string _version = "0.2.1"; - - private string _computerName; - - private string _rigName; - - private CameraControllerSpinnakerCamera _triggeredCameraController0; - - private CameraControllerSpinnakerCamera _triggeredCameraController1; - - private HarpBehavior _harpBehavior = new HarpBehavior(); - - public AindVideoEncodingBenchmarksRig() - { - } - - protected AindVideoEncodingBenchmarksRig(AindVideoEncodingBenchmarksRig other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _computerName = other._computerName; - _rigName = other._rigName; - _triggeredCameraController0 = other._triggeredCameraController0; - _triggeredCameraController1 = other._triggeredCameraController1; - _harpBehavior = other._harpBehavior; - } - - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version - { - get - { - return _version; - } - set - { - _version = value; - } - } - - /// - /// Computer name - /// - [Newtonsoft.Json.JsonPropertyAttribute("computer_name")] - [System.ComponentModel.DescriptionAttribute("Computer name")] - public string ComputerName - { - get - { - return _computerName; - } - set - { - _computerName = value; - } - } - - /// - /// Rig name - /// - [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rig name")] - public string RigName - { - get - { - return _rigName; - } - set - { - _rigName = value; - } - } - - /// - /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_0")] - [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera0 register as a trigger.")] - public CameraControllerSpinnakerCamera TriggeredCameraController0 - { - get - { - return _triggeredCameraController0; - } - set - { - _triggeredCameraController0 = value; - } - } - - /// - /// Camera controller to triggered cameras. Will use Camera1 register as a trigger. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_1")] - [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera1 register as a trigger.")] - public CameraControllerSpinnakerCamera TriggeredCameraController1 - { - get - { - return _triggeredCameraController1; - } - set - { - _triggeredCameraController1 = value; - } - } - - /// - /// Harp behavior board. Will be the source of triggers for the two camera controllers. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_behavior", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp behavior board. Will be the source of triggers for the two camera controller" + - "s.")] - public HarpBehavior HarpBehavior - { - get - { - return _harpBehavior; - } - set - { - _harpBehavior = value; - } - } - - public System.IObservable Process() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVideoEncodingBenchmarksRig(this))); - } - - public System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVideoEncodingBenchmarksRig(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("version = " + _version + ", "); - stringBuilder.Append("computer_name = " + _computerName + ", "); - stringBuilder.Append("rig_name = " + _rigName + ", "); - stringBuilder.Append("triggered_camera_controller_0 = " + _triggeredCameraController0 + ", "); - stringBuilder.Append("triggered_camera_controller_1 = " + _triggeredCameraController1 + ", "); - stringBuilder.Append("harp_behavior = " + _harpBehavior); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("FourCc = " + _fourCc); return true; } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum SpinnakerCameraColorProcessing { @@ -1875,7 +2600,7 @@ private string GetSubtypeDiscriminator(System.Type objectType) } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -1919,16 +2644,29 @@ private static System.IObservable Process(System.IObservable /// Serializes a sequence of data model objects into JSON strings. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] - [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] + [Bonsai.CombinatorAttribute()] public partial class SerializeToJson { + public Newtonsoft.Json.Formatting Formatting { get; set; } + private System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value)); + var formatting = Formatting; + return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -1941,11 +2679,21 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -1970,36 +2718,34 @@ public System.IObservable Process(System.IObservable { return Process(source); } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } } /// /// Deserializes a sequence of JSON strings into data model objects. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { public DeserializeFromJson() { - Type = new Bonsai.Expressions.TypeMapping(); + Type = new Bonsai.Expressions.TypeMapping(); } public Bonsai.Expressions.TypeMapping Type { get; set; } diff --git a/src/Extensions/AindBehaviorSessionModel.cs b/src/Extensions/AindBehaviorSessionModel.cs deleted file mode 100644 index 2b1cf32..0000000 --- a/src/Extensions/AindBehaviorSessionModel.cs +++ /dev/null @@ -1,379 +0,0 @@ -//---------------------- -// -// Generated using the NJsonSchema v10.9.0.0 (Newtonsoft.Json v13.0.0.0) (http://NJsonSchema.org) -// -//---------------------- - - -namespace AindVideoEncodingBenchmarksSchemas.Session -{ - #pragma warning disable // Disable all warnings - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class AindBehaviorSessionModel - { - - private string _aindBehaviorServicesPkgVersion = "0.10.2"; - - private string _version = "0.3.1"; - - private string _experiment; - - private System.Collections.Generic.List _experimenter = new System.Collections.Generic.List(); - - private System.DateTimeOffset _date; - - private string _rootPath; - - private string _sessionName; - - private string _subject; - - private string _experimentVersion; - - private string _notes; - - private string _commitHash; - - private bool _allowDirtyRepo = false; - - private bool _skipHardwareValidation = false; - - public AindBehaviorSessionModel() - { - } - - protected AindBehaviorSessionModel(AindBehaviorSessionModel other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _experiment = other._experiment; - _experimenter = other._experimenter; - _date = other._date; - _rootPath = other._rootPath; - _sessionName = other._sessionName; - _subject = other._subject; - _experimentVersion = other._experimentVersion; - _notes = other._notes; - _commitHash = other._commitHash; - _allowDirtyRepo = other._allowDirtyRepo; - _skipHardwareValidation = other._skipHardwareValidation; - } - - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version - { - get - { - return _version; - } - set - { - _version = value; - } - } - - /// - /// Name of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the experiment")] - public string Experiment - { - get - { - return _experiment; - } - set - { - _experiment = value; - } - } - - /// - /// Name of the experimenter - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] - [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] - public System.Collections.Generic.List Experimenter - { - get - { - return _experimenter; - } - set - { - _experimenter = value; - } - } - - /// - /// Date of the experiment - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the experiment")] - public System.DateTimeOffset Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - /// - /// Root path where data will be logged - /// - [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] - public string RootPath - { - get - { - return _rootPath; - } - set - { - _rootPath = value; - } - } - - /// - /// Name of the session. This will be used to create a folder in the root path. - /// - [Newtonsoft.Json.JsonPropertyAttribute("session_name")] - [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path.")] - public string SessionName - { - get - { - return _sessionName; - } - set - { - _sessionName = value; - } - } - - /// - /// Name of the subject - /// - [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the subject")] - public string Subject - { - get - { - return _subject; - } - set - { - _subject = value; - } - } - - /// - /// Version of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment_version", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Version of the experiment")] - public string ExperimentVersion - { - get - { - return _experimentVersion; - } - set - { - _experimentVersion = value; - } - } - - /// - /// Notes about the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - /// - /// Commit hash of the repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] - [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] - public string CommitHash - { - get - { - return _commitHash; - } - set - { - _commitHash = value; - } - } - - /// - /// Allow running from a dirty repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] - [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] - public bool AllowDirtyRepo - { - get - { - return _allowDirtyRepo; - } - set - { - _allowDirtyRepo = value; - } - } - - /// - /// Skip hardware validation - /// - [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] - [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] - public bool SkipHardwareValidation - { - get - { - return _skipHardwareValidation; - } - set - { - _skipHardwareValidation = value; - } - } - - public System.IObservable Process() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); - } - - public System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("version = " + _version + ", "); - stringBuilder.Append("experiment = " + _experiment + ", "); - stringBuilder.Append("experimenter = " + _experimenter + ", "); - stringBuilder.Append("date = " + _date + ", "); - stringBuilder.Append("root_path = " + _rootPath + ", "); - stringBuilder.Append("session_name = " + _sessionName + ", "); - stringBuilder.Append("subject = " + _subject + ", "); - stringBuilder.Append("experiment_version = " + _experimentVersion + ", "); - stringBuilder.Append("notes = " + _notes + ", "); - stringBuilder.Append("commit_hash = " + _commitHash + ", "); - stringBuilder.Append("allow_dirty_repo = " + _allowDirtyRepo + ", "); - stringBuilder.Append("skip_hardware_validation = " + _skipHardwareValidation); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Serializes a sequence of data model objects into JSON strings. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - public partial class SerializeToJson - { - - private System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value)); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - } - - - /// - /// Deserializes a sequence of JSON strings into data model objects. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public DeserializeFromJson() - { - Type = new Bonsai.Expressions.TypeMapping(); - } - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = (Bonsai.Expressions.TypeMapping)Type; - var returnType = typeMapping.GetType().GetGenericArguments()[0]; - return System.Linq.Expressions.Expression.Call( - typeof(DeserializeFromJson), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - - private static System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.DeserializeObject(value)); - } - } -} \ No newline at end of file diff --git a/src/Extensions/AindVideoEncodingBenchmarksTaskLogic.cs b/src/Extensions/AindVideoEncodingBenchmarksTaskLogic.cs deleted file mode 100644 index 1855d0d..0000000 --- a/src/Extensions/AindVideoEncodingBenchmarksTaskLogic.cs +++ /dev/null @@ -1,325 +0,0 @@ -//---------------------- -// -// Generated using the NJsonSchema v10.9.0.0 (Newtonsoft.Json v13.0.0.0) (http://NJsonSchema.org) -// -//---------------------- - - -namespace AindVideoEncodingBenchmarksSchemas.TaskLogic -{ - #pragma warning disable // Disable all warnings - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class AindVideoEncodingBenchmarksTaskParameters - { - - private double? _rngSeed; - - private string _aindBehaviorServicesPkgVersion = "0.10.2"; - - private bool _saveRawVideo = false; - - public AindVideoEncodingBenchmarksTaskParameters() - { - } - - protected AindVideoEncodingBenchmarksTaskParameters(AindVideoEncodingBenchmarksTaskParameters other) - { - _rngSeed = other._rngSeed; - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _saveRawVideo = other._saveRawVideo; - } - - /// - /// Seed of the random number generator - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rng_seed")] - [System.ComponentModel.DescriptionAttribute("Seed of the random number generator")] - public double? RngSeed - { - get - { - return _rngSeed; - } - set - { - _rngSeed = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } - - /// - /// For each video-writer object, will also save the RAW encoded video to disk. Use at your own risk. - /// - [Newtonsoft.Json.JsonPropertyAttribute("save_raw_video")] - [System.ComponentModel.DescriptionAttribute("For each video-writer object, will also save the RAW encoded video to disk. Use a" + - "t your own risk.")] - public bool SaveRawVideo - { - get - { - return _saveRawVideo; - } - set - { - _saveRawVideo = value; - } - } - - public System.IObservable Process() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVideoEncodingBenchmarksTaskParameters(this))); - } - - public System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVideoEncodingBenchmarksTaskParameters(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("rng_seed = " + _rngSeed + ", "); - stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("save_raw_video = " + _saveRawVideo); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class AindVideoEncodingBenchmarksTaskLogic - { - - private string _name = "AindVideoEncodingBenchmarks"; - - private string _description = ""; - - private AindVideoEncodingBenchmarksTaskParameters _taskParameters = new AindVideoEncodingBenchmarksTaskParameters(); - - private string _version = "0.1.1"; - - private string _stageName; - - public AindVideoEncodingBenchmarksTaskLogic() - { - } - - protected AindVideoEncodingBenchmarksTaskLogic(AindVideoEncodingBenchmarksTaskLogic other) - { - _name = other._name; - _description = other._description; - _taskParameters = other._taskParameters; - _version = other._version; - _stageName = other._stageName; - } - - /// - /// Name of the task logic - /// - [Newtonsoft.Json.JsonPropertyAttribute("name")] - [System.ComponentModel.DescriptionAttribute("Name of the task logic")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - /// - /// Description of the task. - /// - [Newtonsoft.Json.JsonPropertyAttribute("description")] - [System.ComponentModel.DescriptionAttribute("Description of the task.")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - /// - /// Parameters of the task logic - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("task_parameters", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Parameters of the task logic")] - public AindVideoEncodingBenchmarksTaskParameters TaskParameters - { - get - { - return _taskParameters; - } - set - { - _taskParameters = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version - { - get - { - return _version; - } - set - { - _version = value; - } - } - - /// - /// Optional stage name the `Task` object instance represents. - /// - [Newtonsoft.Json.JsonPropertyAttribute("stage_name")] - [System.ComponentModel.DescriptionAttribute("Optional stage name the `Task` object instance represents.")] - public string StageName - { - get - { - return _stageName; - } - set - { - _stageName = value; - } - } - - public System.IObservable Process() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVideoEncodingBenchmarksTaskLogic(this))); - } - - public System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVideoEncodingBenchmarksTaskLogic(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("name = " + _name + ", "); - stringBuilder.Append("description = " + _description + ", "); - stringBuilder.Append("task_parameters = " + _taskParameters + ", "); - stringBuilder.Append("version = " + _version + ", "); - stringBuilder.Append("stage_name = " + _stageName); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Serializes a sequence of data model objects into JSON strings. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - public partial class SerializeToJson - { - - private System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value)); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - } - - - /// - /// Deserializes a sequence of JSON strings into data model objects. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public DeserializeFromJson() - { - Type = new Bonsai.Expressions.TypeMapping(); - } - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = (Bonsai.Expressions.TypeMapping)Type; - var returnType = typeMapping.GetType().GetGenericArguments()[0]; - return System.Linq.Expressions.Expression.Call( - typeof(DeserializeFromJson), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - - private static System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.DeserializeObject(value)); - } - } -} \ No newline at end of file diff --git a/src/Extensions/TriggeredCamerasLogger.bonsai b/src/Extensions/TriggeredCamerasLogger.bonsai index ac2c41a..dc1fcca 100644 --- a/src/Extensions/TriggeredCamerasLogger.bonsai +++ b/src/Extensions/TriggeredCamerasLogger.bonsai @@ -2,7 +2,7 @@ diff --git a/src/aind_behavior_just_frames/__init__.py b/src/aind_behavior_just_frames/__init__.py new file mode 100644 index 0000000..98cffdf --- /dev/null +++ b/src/aind_behavior_just_frames/__init__.py @@ -0,0 +1,30 @@ +import re +from importlib.metadata import PackageNotFoundError, version + + +def pep440_to_semver(ver: str) -> str: + """ + Convert a PEP 440 version to a SemVer-compatible string. + + Examples: + 1.2.3rc2 -> 1.2.3-rc2 + 1.2.3a1 -> 1.2.3-a1 + 1.2.3b1 -> 1.2.3-b1 + 1.2.3.dev4 -> 1.2.3-dev4 + 1.2.3.post1 -> 1.2.3+post1 + """ + # pre-release: a, b, rc -> -aN, -bN, -rcN + ver = re.sub(r"(?<=\d)(a|b|rc)(\d+)", r"-\1\2", ver) + # dev release: .devN -> -devN + ver = re.sub(r"\.dev(\d+)", r"-dev\1", ver) + # post release: .postN -> +postN + ver = re.sub(r"\.post(\d+)", r"+post\1", ver) + return ver + + +try: + __version__ = version(__name__) +except PackageNotFoundError: + __version__ = "0.0.0" + +__semver__ = pep440_to_semver(__version__) diff --git a/src/aind_behavior_just_frames/cli.py b/src/aind_behavior_just_frames/cli.py new file mode 100644 index 0000000..89231fb --- /dev/null +++ b/src/aind_behavior_just_frames/cli.py @@ -0,0 +1,44 @@ +import typing as t + +from pydantic import Field, RootModel +from pydantic_settings import BaseSettings, CliApp, CliSubCommand + +from aind_behavior_just_frames import __semver__, regenerate +from aind_behavior_just_frames.launcher import ClabeCli + + +class VersionCli(RootModel): + root: t.Any + + def cli_cmd(self) -> None: + print(__semver__) + + +class DslRegenerateCli(RootModel): + root: t.Any + + def cli_cmd(self) -> None: + regenerate.main() + + +class VrForagingCli(BaseSettings, cli_prog_name="vr-foraging", cli_kebab_case=True): + version: CliSubCommand[VersionCli] = Field( + description="Print the version of the vr-foraging package.", + ) + regenerate: CliSubCommand[DslRegenerateCli] = Field( + description="Regenerate the vr-foraging dsl dependencies.", + ) + clabe: CliSubCommand[ClabeCli] = Field( + description="Run the Clabe CLI.", + ) + + def cli_cmd(self): + return CliApp().run_subcommand(self) + + +def main(): + CliApp().run(VrForagingCli) + + +if __name__ == "__main__": + main() diff --git a/src/aind_behavior_just_frames/launcher.py b/src/aind_behavior_just_frames/launcher.py new file mode 100644 index 0000000..40a3449 --- /dev/null +++ b/src/aind_behavior_just_frames/launcher.py @@ -0,0 +1,25 @@ +import logging + +from clabe.launcher import Launcher, LauncherCliArgs +from pydantic_settings import CliApp + +logger = logging.getLogger(__name__) + + +def experiment(launcher: Launcher) -> None: + return + + +class ClabeCli(LauncherCliArgs): + def cli_cmd(self): + launcher = Launcher(settings=self) + launcher.run_experiment(experiment) + return None + + +def main() -> None: + CliApp().run(ClabeCli) + + +if __name__ == "__main__": + main() diff --git a/src/aind_behavior_just_frames/regenerate.py b/src/aind_behavior_just_frames/regenerate.py new file mode 100644 index 0000000..d9cdd7c --- /dev/null +++ b/src/aind_behavior_just_frames/regenerate.py @@ -0,0 +1,34 @@ +from pathlib import Path +from typing import Union + +import pydantic +from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.utils import BonsaiSgenSerializers, convert_pydantic_to_bonsai + +from aind_behavior_just_frames.rig import AindJustFramesRig + +SCHEMA_ROOT = Path("./src/DataSchemas/") +EXTENSIONS_ROOT = Path("./src/Extensions/") +NAMESPACE_PREFIX = "AindJustFramesSchemas" + + +def main(): + models = [ + AindJustFramesRig, + AindBehaviorSessionModel, + ] + model = pydantic.RootModel[Union[tuple(models)]] + + convert_pydantic_to_bonsai( + model, + model_name="aind_behavior_just_frames", + root_element="Root", + cs_namespace=NAMESPACE_PREFIX, + json_schema_output_dir=SCHEMA_ROOT, + cs_output_dir=EXTENSIONS_ROOT, + cs_serializer=[BonsaiSgenSerializers.JSON], + ) + + +if __name__ == "__main__": + main() diff --git a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/rig.py b/src/aind_behavior_just_frames/rig.py similarity index 50% rename from src/DataSchemas/aind_behavior_video_encoding_benchmarks/rig.py rename to src/aind_behavior_just_frames/rig.py index 7ae23cd..c34fb2f 100644 --- a/src/DataSchemas/aind_behavior_video_encoding_benchmarks/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -1,27 +1,26 @@ -# Import core types -from __future__ import annotations - -# Import core types from typing import Literal, Optional import aind_behavior_services.rig as rig from aind_behavior_services.rig import AindBehaviorRigModel from pydantic import Field -__version__ = "0.2.1" +from . import __semver__ -class AindVideoEncodingBenchmarksRig(AindBehaviorRigModel): - version: Literal[__version__] = __version__ - triggered_camera_controller_0: Optional[rig.CameraController[rig.SpinnakerCamera]] = Field( +class AindJustFramesRig(AindBehaviorRigModel): + version: Literal[__semver__] = __semver__ + triggered_camera_controller_0: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( default=None, description="Camera controller to triggered cameras. Will use Camera0 register as a trigger.", ) - triggered_camera_controller_1: Optional[rig.CameraController[rig.SpinnakerCamera]] = Field( + triggered_camera_controller_1: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( default=None, description="Camera controller to triggered cameras. Will use Camera1 register as a trigger.", ) - harp_behavior: rig.HarpBehavior = Field( + harp_behavior: rig.harp.HarpBehavior = Field( ..., description="Harp behavior board. Will be the source of triggers for the two camera controllers.", ) + harp_white_rabbit: Optional[rig.harp.HarpWhiteRabbit] = Field( + default=None, description="Harp White Rabbit for time synchronization." + ) diff --git a/src/main.bonsai b/src/main.bonsai index cf44557..6b1f6f3 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -1,10 +1,10 @@  diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 4cf6029..a060d4b 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -4,14 +4,15 @@ from pathlib import Path from typing import Generic, List, Optional, TypeVar, Union -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_services.utils import run_bonsai_process -from aind_behavior_video_encoding_benchmarks.rig import AindVideoEncodingBenchmarksRig -from aind_behavior_video_encoding_benchmarks.task_logic import ( +from aind_behavior_just_frames.task_logic import ( AindVideoEncodingBenchmarksTaskLogic, ) +from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.utils import run_bonsai_process from pydantic import ValidationError +from aind_behavior_just_frames.rig import AindVideoEncodingBenchmarksRig + sys.path.append(".") from examples import examples # isort:skip # pylint: disable=wrong-import-position from tests import JSON_ROOT # isort:skip # pylint: disable=wrong-import-position diff --git a/uv.lock b/uv.lock index 2332c35..daf53c9 100644 --- a/uv.lock +++ b/uv.lock @@ -1,75 +1,55 @@ version = 1 +revision = 3 requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14'", + "python_full_version >= '3.12' and python_full_version < '3.14'", "python_full_version < '3.12'", ] [[package]] -name = "aind-behavior-curriculum" -version = "0.0.32" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, - { name = "pydantic" }, - { name = "semver" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/45/3d/4cbcc41155725e2e4f7258a8c09e709eccb72211c7858f88803c1154997a/aind_behavior_curriculum-0.0.32.tar.gz", hash = "sha256:4ef0bda299ae0333cf1e4033fdc04a76a478b91be651b0634b421178e8217003", size = 121866 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/4c/5890c16cb084421949795ef7f9688541784ce209287cf6c1d2866f974504/aind_behavior_curriculum-0.0.32-py3-none-any.whl", hash = "sha256:3f41c3b1be1221dd7735a3fc29fa6a0117c7aa77ff14842db77bf8135c5a9693", size = 46785 }, -] - -[[package]] -name = "aind-behavior-experiment-launcher" -version = "0.4.1" +name = "accessible-pygments" +version = "0.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aind-behavior-services" }, - { name = "aind-slims-api" }, - { name = "gitpython" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "rich" }, - { name = "semver" }, + { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/449f9450ddb265a9382b2a8fe943dc3943a623af99e41dde7c2234664528/aind_behavior_experiment_launcher-0.4.1.tar.gz", hash = "sha256:b6e1a9ec016b393edb12989a5dbf4d119e5a94ee71a1499052b26d019e3c4d2d", size = 124337 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/62/c9387a44401bc73ad79007bc36f2a13e43e1ee323d7c0aae9667f612f5d2/aind_behavior_experiment_launcher-0.4.1-py3-none-any.whl", hash = "sha256:b8d2494cf4848cbe59d0bb33069501182827cc0ee225142040b4b26b190b5c8f", size = 44881 }, -] - -[package.optional-dependencies] -aind-services = [ - { name = "aind-data-schema" }, - { name = "aind-watchdog-service" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, ] [[package]] -name = "aind-behavior-services" -version = "0.10.2" +name = "aind-behavior-curriculum" +version = "0.0.35" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aind-behavior-curriculum" }, - { name = "gitpython" }, - { name = "harp-python" }, + { name = "jinja2" }, { name = "pydantic" }, - { name = "scikit-learn" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/d8/2fbae3376c1e70d2e3e4c39926d0b0290bdb1e9267fb5d331a2d9644f73b/aind_behavior_services-0.10.2.tar.gz", hash = "sha256:6f84521e91377056444de1896d86864729624aa94eccf164b54cb0f8b30f6a43", size = 135934 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/c7/bb935282362302860d3ae7bc6765be7fc3b2f74af0ca200ad8ed91f03dac/aind_behavior_curriculum-0.0.35.tar.gz", hash = "sha256:594b735a254f6ab9112504efd9eb78b5e2bbd5d93d2c88608889c8a38cfcd234", size = 122480, upload-time = "2025-10-02T23:41:57.49Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/ce/c3bc2c74dc27553dc656b7a7ee89ec7425de7eacd13be7b490a9c2025b1f/aind_behavior_services-0.10.2-py3-none-any.whl", hash = "sha256:ee4f5365db6ecd427b3fffe43688db79105b7244582262a36b38f6d7dafc25c2", size = 49479 }, + { url = "https://files.pythonhosted.org/packages/a9/7d/d90a57207aebc7fa06c575d30248984821199450de78e932211da0becf76/aind_behavior_curriculum-0.0.35-py3-none-any.whl", hash = "sha256:bf4c64b61195fa15e73d381fe53aac438ede9ca09f8f57968220a48d335c0656", size = 47389, upload-time = "2025-10-02T23:41:56.296Z" }, ] [[package]] -name = "aind-behavior-video-encoding-benchmarks" +name = "aind-behavior-just-frames" +version = "0.5.0rc0" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, + { name = "pydantic-settings" }, ] [package.optional-dependencies] +launcher = [ + { name = "aind-clabe", extra = ["aind-services"] }, +] + +[package.dev-dependencies] dev = [ - { name = "aind-behavior-experiment-launcher", extra = ["aind-services"] }, + { name = "aind-behavior-just-frames", extra = ["launcher"] }, { name = "codespell" }, { name = "ruff" }, ] @@ -81,157 +61,179 @@ docs = [ { name = "sphinx-jinja" }, { name = "sphinx-jsonschema" }, ] -launcher = [ - { name = "aind-behavior-experiment-launcher", extra = ["aind-services"] }, -] [package.metadata] requires-dist = [ - { name = "aind-behavior-experiment-launcher", extras = ["aind-services"], marker = "extra == 'launcher'" }, - { name = "aind-behavior-services", specifier = ">=0.10,<0.11" }, - { name = "aind-behavior-video-encoding-benchmarks", extras = ["launcher"], marker = "extra == 'dev'" }, - { name = "autodoc-pydantic", extras = ["erdantic"], marker = "extra == 'docs'" }, - { name = "codespell", marker = "extra == 'dev'" }, - { name = "furo", marker = "extra == 'docs'" }, - { name = "myst-parser", marker = "extra == 'docs'" }, - { name = "ruff", marker = "extra == 'dev'" }, - { name = "sphinx", marker = "extra == 'docs'", specifier = "<7.3" }, - { name = "sphinx-jinja", marker = "extra == 'docs'" }, - { name = "sphinx-jsonschema", marker = "extra == 'docs'" }, + { name = "aind-behavior-services", specifier = ">=0.12,<0.13" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.2,<0.9.0" }, + { name = "pydantic-settings" }, ] +provides-extras = ["launcher"] -[[package]] -name = "aind-codeocean-pipeline-monitor" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "codeocean" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, +[package.metadata.requires-dev] +dev = [ + { name = "aind-behavior-just-frames", extras = ["launcher"] }, + { name = "codespell" }, + { name = "ruff" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/26/2762b2556406990d47589b093801e17a67a0afb6e06c91182152228135f6/aind_codeocean_pipeline_monitor-0.7.1.tar.gz", hash = "sha256:2239abd128a4d68103e4cfd5a5aa8c261d2b5d24725b0e96e29ece629e881ab8", size = 47629 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/39/c244595e55bc315ffbf4d4629e159ccdd2b0f84e7e88bb241bb870f78e64/aind_codeocean_pipeline_monitor-0.7.1-py3-none-any.whl", hash = "sha256:8a3a25efdcb0b9020927d3646b52cbe4214f93fde189c101977c5a6d9f10fc05", size = 11525 }, +docs = [ + { name = "autodoc-pydantic", extras = ["erdantic"] }, + { name = "furo" }, + { name = "myst-parser" }, + { name = "sphinx" }, + { name = "sphinx-jinja" }, + { name = "sphinx-jsonschema" }, ] [[package]] -name = "aind-data-schema" -version = "1.4.0" +name = "aind-behavior-services" +version = "0.12.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aind-data-schema-models" }, + { name = "aind-behavior-curriculum" }, + { name = "gitpython" }, + { name = "harp-python" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/d3/b8c49737c207966eef2a19f74f599b69f4b7fc3d8abfc33a164397252088/aind_data_schema-1.4.0.tar.gz", hash = "sha256:9768e00ee1f7ea4da72abc4b365ee807c2129dd30da96e759ae17ed93824b40e", size = 858325 } +sdist = { url = "https://files.pythonhosted.org/packages/46/62/68a09654bf253bc1e653040c68d456ca928e385bbbb1bbf038da25134a84/aind_behavior_services-0.12.3.tar.gz", hash = "sha256:20bae171993017ebfd5d5ce09b610110947902b05c583f517c2efb732ab336f8", size = 27418, upload-time = "2025-10-15T22:16:00.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/da/bce4b9d3122cb98e055d7a9d3159117eb810992605aa849bef4b9e8069fc/aind_data_schema-1.4.0-py3-none-any.whl", hash = "sha256:d82fbbd96f3588a9b03b0275bb89831a1b901c5b63e8790f07583d0fd4a4c732", size = 65020 }, + { url = "https://files.pythonhosted.org/packages/67/c9/5b1b1da5a8dccabf4b6b9b42235eceaa4ee1f2c816a402e322f192f77a8a/aind_behavior_services-0.12.3-py3-none-any.whl", hash = "sha256:0a00588c1e29bac1295534e0c17169de862f914cd83b29248ff508fb782bdb3e", size = 38254, upload-time = "2025-10-15T22:15:59.672Z" }, ] [[package]] -name = "aind-data-schema-models" -version = "0.7.5" +name = "aind-clabe" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-resources" }, + { name = "aind-behavior-services" }, + { name = "gitpython" }, { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "rich" }, + { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/41/142150bb66ce16856e75469945a3e1ec21ea4c6cdaac27bacf962854e3ac/aind_data_schema_models-0.7.5.tar.gz", hash = "sha256:9605f0999930b595b9d92316ada0b3a8fa8d28c537330cc5f6198cc8e59d3dee", size = 552889 } +sdist = { url = "https://files.pythonhosted.org/packages/8e/37/dff7f633606ce87600a4114bd1dd506f2109d5d891f66030b5769426ac1c/aind_clabe-0.8.2.tar.gz", hash = "sha256:f384d51a541b900f5783a9523eba4f885cfa69850a2ac33881db07ca7a7f1d3a", size = 48635, upload-time = "2025-10-21T02:29:17.795Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/c1/e2177d7e0fa1102e4dcd4563d519c9ed56177d0b6df552dd9e50aacb1367/aind_data_schema_models-0.7.5-py3-none-any.whl", hash = "sha256:f6d934451c672e3c48691759cd5cfb615306c40f30625ef0323285dc69cfceff", size = 532063 }, + { url = "https://files.pythonhosted.org/packages/6d/14/0ac35972d01f3a82bc1a720b42589929dd8beabc6066dc26ef16597e4e96/aind_clabe-0.8.2-py3-none-any.whl", hash = "sha256:d366a0495763d64d8bfb2fbc195951269b7e0fb3152bd967f944b48155384698", size = 66180, upload-time = "2025-10-21T02:29:16.829Z" }, +] + +[package.optional-dependencies] +aind-services = [ + { name = "aind-data-schema" }, + { name = "aind-data-transfer-service" }, + { name = "cryptography" }, + { name = "ldap3", marker = "sys_platform == 'win32'" }, + { name = "ms-active-directory" }, + { name = "msal", marker = "sys_platform == 'win32'" }, + { name = "pykeepass" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "winkerberos", marker = "sys_platform == 'win32'" }, ] [[package]] -name = "aind-data-transfer-models" -version = "0.17.0" +name = "aind-data-schema" +version = "2.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aind-codeocean-pipeline-monitor" }, { name = "aind-data-schema-models" }, - { name = "aind-metadata-mapper" }, - { name = "aind-slurm-rest" }, - { name = "codeocean" }, - { name = "email-validator" }, { name = "pydantic" }, - { name = "pydantic-settings" }, + { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/a0/4e96d2fdbc4a90ed4db7e18d9d18f6e6fa903bd7abddb0cb0021469ce613/aind_data_transfer_models-0.17.0.tar.gz", hash = "sha256:41963e417b3f25fb2106174979fec91f737c88fd470aa3a5943153d91f334c6d", size = 49363 } +sdist = { url = "https://files.pythonhosted.org/packages/46/cc/636358c2f3629c293f201c8f3eba6a86335b7979c648282b7f6fb59ba675/aind_data_schema-2.0.3.tar.gz", hash = "sha256:def6a43d8f9e6259177f2b58e2b830b38d7e7b8dc006827314f6ea8b1577d55b", size = 739960, upload-time = "2025-10-02T18:04:49.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/16/78b414d802a75e0bcba8248e5f18b418470a5c405e736fe24da993e1a303/aind_data_transfer_models-0.17.0-py3-none-any.whl", hash = "sha256:7291e5caf105be1f17fbaad8bc54f8fe9ccc19173c07a91441aee5d74d18c867", size = 14514 }, + { url = "https://files.pythonhosted.org/packages/ac/61/dae645b22f3b38b1f28a597a2438b95c5e239f8deb1a4f2b9e1dc7187f5f/aind_data_schema-2.0.3-py3-none-any.whl", hash = "sha256:a216ad39e6d8db11d45e3686f5bfa65eec2f676db1031b279e52112de151f023", size = 85042, upload-time = "2025-10-02T18:04:47.412Z" }, ] [[package]] -name = "aind-metadata-mapper" -version = "0.24.1" +name = "aind-data-schema-models" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aind-data-schema-models" }, - { name = "pydantic-settings" }, + { name = "importlib-resources" }, + { name = "pydantic" }, + { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/ad/3e970cfe06bff937a53251e8730baadf94f65dcf1ea37e6d2c3b43d7be5b/aind_metadata_mapper-0.24.1.tar.gz", hash = "sha256:01d5f849667115527edca5ec6bcfda35792caa2b8e05036d81348e57916ece3d", size = 773597 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/ea/a6b5bacf52de8e904ca9bb88dc1a5f8596dfa0b12fa5812e44041835d535/aind_data_schema_models-4.3.0.tar.gz", hash = "sha256:3608c89d91192d54dee40823e385e4f6dbdac658987af7fadefd68c02d3490fb", size = 324212, upload-time = "2025-09-22T21:54:25.374Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/05/87bcfc49da2bc206b1fc95f7b532b8ef9949ececf33acb92027ab08fe677/aind_metadata_mapper-0.24.1-py3-none-any.whl", hash = "sha256:5acd82c0414442a06531882e86eab38f1a67ff17829e35e48cea867c2d5acf24", size = 93773 }, + { url = "https://files.pythonhosted.org/packages/11/e6/136ff5288b154c022c4cb7a047faf946755aca597a75490767a479936921/aind_data_schema_models-4.3.0-py3-none-any.whl", hash = "sha256:62703b4425009c930511de366a85fb57e5dc52f7493fd0a49871a90429e5832f", size = 297854, upload-time = "2025-09-22T21:54:24.216Z" }, ] [[package]] -name = "aind-slims-api" -version = "0.1.21" +name = "aind-data-transfer-service" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "aind-data-schema-models" }, + { name = "email-validator" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "slims-python-api" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/f0/7ea0d61d199a63997fdc910ee269dabbd5118cbc380d94f48dc387455d7f/aind_slims_api-0.1.21.tar.gz", hash = "sha256:4442764b61d0fc79c5d98f10dc17448d76a62f0364ace82cb9d75cc6052f7aba", size = 1201156 } +sdist = { url = "https://files.pythonhosted.org/packages/3d/75/0cbf20d07d2e47c6d19f3f46bb1ebc5c884c9882b3f0934c8e20c830e058/aind_data_transfer_service-1.19.1.tar.gz", hash = "sha256:b4ac892453fb3a9de8981361fded4b18d608aa40d55874e0acc9a1c4de90f88a", size = 37441, upload-time = "2025-10-06T22:43:58.182Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/b6/d495535fbecdc43e13a2aaef328ab07e1e20148ee738553f3e6c196bd0d9/aind_slims_api-0.1.21-py3-none-any.whl", hash = "sha256:4a707e5962e490b71daa2f74093819c68a8dd0990abfc1b95e08310e869dba2a", size = 32455 }, + { url = "https://files.pythonhosted.org/packages/12/62/594a4609d1ceda3b39147becc766dc52217d8f7c2b438d22cd6a8938f8f9/aind_data_transfer_service-1.19.1-py3-none-any.whl", hash = "sha256:c3fe2b1e51050db6492f35da70fde0755025d437e04e8d0b5b800db0e8abc4a5", size = 23370, upload-time = "2025-10-06T22:43:57.191Z" }, ] [[package]] -name = "aind-slurm-rest" -version = "0.2.1" +name = "alabaster" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/e8/771256e060bf2415c30354781256ad194b359d45fae4c127573bcc97e7af/aind_slurm_rest-0.2.1.tar.gz", hash = "sha256:a61aff6be83e098a1c33da90b9a086d2224686f1ad8700a1d1baa362504d97f2", size = 148990 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/1b/23d9ff2e501d46ded1e9acff9e0962a9cf087ff9ff26ee174849317e65ef/aind_slurm_rest-0.2.1-py3-none-any.whl", hash = "sha256:7edadbe5df69bdae9814e7aa128ad9df547fc24ebe178daaa02a7e944a632c16", size = 359526 }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] [[package]] -name = "aind-watchdog-service" -version = "0.1.4" +name = "annotated-types" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aind-data-schema-models" }, - { name = "aind-data-transfer-models" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/c9/2ef15e05eb8ad53a1b29fcc41d262f65e26d4aafe9e4dddd728c6b49829c/aind_watchdog_service-0.1.4.tar.gz", hash = "sha256:9e4d256ef4724c8c6c182e29bc0438ec3dcafd8369dcd5204e2e78aa07988762", size = 402285 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/07/27ae97292be5569d7c947e035e9e193c183e278d47970c3b94a7f7962357/aind_watchdog_service-0.1.4-py3-none-any.whl", hash = "sha256:5cb1ec5f680b0c5029c995f22cd2cf44494486b68042854a4bdfa55ed37994f4", size = 50685 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] -name = "alabaster" -version = "0.7.16" +name = "argon2-cffi" +version = "25.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, ] [[package]] -name = "annotated-types" -version = "0.7.0" +name = "argon2-cffi-bindings" +version = "25.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, ] [[package]] @@ -244,7 +246,7 @@ dependencies = [ { name = "sphinx" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001 }, + { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001, upload-time = "2024-04-27T10:57:00.542Z" }, ] [package.optional-dependencies] @@ -256,193 +258,311 @@ erdantic = [ name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "beautifulsoup4" -version = "4.13.3" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, ] [[package]] -name = "blinker" -version = "1.9.0" +name = "certifi" +version = "2025.10.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, ] [[package]] -name = "certifi" -version = "2025.1.31" +name = "cffi" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] [[package]] name = "click" -version = "8.1.8" +version = "8.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "codeocean" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dataclasses-json" }, - { name = "requests" }, - { name = "requests-toolbelt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ea/86/509616d367bb1c7b1d08cdb407636f17dc34ce976d8f003290248fcb5d8c/codeocean-0.5.0.tar.gz", hash = "sha256:5631d80778106b189c7d58417ebc66a86e70a6d4a1f631103c97de69ee59666b", size = 8611 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/11/491dd89d5a1abcfba756c4a24eb88b639aae163965a55062a8311c8f5d27/codeocean-0.5.0-py3-none-any.whl", hash = "sha256:9434310e7c51a05897f3f82ba8c2a7ba9aaf0768cf9f2b454a03c88fbb74e98c", size = 9482 }, + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, ] [[package]] name = "codespell" version = "2.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740 } +sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501 }, + { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] -name = "dataclasses-json" -version = "0.6.7" +name = "construct" +version = "2.10.70" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "marshmallow" }, - { name = "typing-inspect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227 } +sdist = { url = "https://files.pythonhosted.org/packages/02/77/8c84b98eca70d245a2a956452f21d57930d22ab88cbeed9290ca630cf03f/construct-2.10.70.tar.gz", hash = "sha256:4d2472f9684731e58cc9c56c463be63baa1447d674e0d66aeb5627b22f512c29", size = 86337, upload-time = "2023-11-29T08:44:49.545Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, + { url = "https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl", hash = "sha256:c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30", size = 63020, upload-time = "2023-11-29T08:44:46.876Z" }, ] [[package]] -name = "deprecation" -version = "2.1.0" +name = "cryptography" +version = "46.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, + { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, + { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, ] [[package]] name = "dnspython" -version = "2.7.0" +version = "2.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, ] [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", size = 2058365 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", size = 572666 }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] [[package]] name = "email-validator" -version = "2.2.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, ] [[package]] name = "erdantic" -version = "1.0.5" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, @@ -453,40 +573,25 @@ dependencies = [ { name = "typer" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/ff/30b37ea3aa78c84558d8042150adc653b2a6a9af2bde2785d37177646aca/erdantic-1.0.5.tar.gz", hash = "sha256:e35cc1babb37b8dc62fc220ce61a167afaebd11e391c6bd53882918a3b01644b", size = 813473 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/5e/eef0d436e53ca91dd5768ff5f7baa65bac8a27b90f94002c95b984556f5f/erdantic-1.0.5-py3-none-any.whl", hash = "sha256:f9ae0016d5e6116e14cf11b75c6a1ead467d7a13adbea9632df102199e22499a", size = 30261 }, -] - -[[package]] -name = "flask" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "blinker" }, - { name = "click" }, - { name = "itsdangerous" }, - { name = "jinja2" }, - { name = "werkzeug" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/50/dff6380f1c7f84135484e176e0cac8690af72fa90e932ad2a0a60e28c69b/flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", size = 680824 } +sdist = { url = "https://files.pythonhosted.org/packages/6f/17/5c9709349221b1a972b4470e735570eee3dd2e2ee0ed71f28fb0e8c0d79a/erdantic-1.2.0.tar.gz", hash = "sha256:165979caf26984055e476d0201b24cdf1c5f38b60a6f141e82f9352a40d12b65", size = 920914, upload-time = "2025-09-15T18:07:11.351Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136", size = 102979 }, + { url = "https://files.pythonhosted.org/packages/06/ee/dc88399e2a872fd7ce5a192cfbcf8bd996574bb6c7470912c8c2fca20527/erdantic-1.2.0-py3-none-any.whl", hash = "sha256:7c67adcf22150b77a24609734c7efc676f71824f8f5662fd21450ec1cdbe0a0c", size = 34428, upload-time = "2025-09-15T18:07:09.766Z" }, ] [[package]] name = "furo" -version = "2024.8.6" +version = "2025.9.25" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "accessible-pygments" }, { name = "beautifulsoup4" }, { name = "pygments" }, { name = "sphinx" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +sdist = { url = "https://files.pythonhosted.org/packages/4e/29/ff3b83a1ffce74676043ab3e7540d398e0b1ce7660917a00d7c4958b93da/furo-2025.9.25.tar.gz", hash = "sha256:3eac05582768fdbbc2bdfa1cdbcdd5d33cfc8b4bd2051729ff4e026a1d7e0a98", size = 1662007, upload-time = "2025-09-25T21:37:19.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, + { url = "https://files.pythonhosted.org/packages/ba/69/964b55f389c289e16ba2a5dfe587c3c462aac09e24123f09ddf703889584/furo-2025.9.25-py3-none-any.whl", hash = "sha256:2937f68e823b8e37b410c972c371bc2b1d88026709534927158e0cb3fac95afe", size = 340409, upload-time = "2025-09-25T21:37:17.244Z" }, ] [[package]] @@ -496,70 +601,61 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, ] [[package]] name = "gitpython" -version = "3.1.44" +version = "3.1.45" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, ] [[package]] name = "harp-python" -version = "0.4.0" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pandas" }, { name = "pydantic-yaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/06/76f8f5880a529da914ecb90a808aa54c460f740ab1716c22215e7c8f5b6e/harp_python-0.4.0.tar.gz", hash = "sha256:d2fddb6890e2d52897a3a6d8d5932c0ea569f44340c17c43c7a34c69ef69bbe8", size = 15483 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/78/c894fe30960d7df9737bc0e15390b45844c857192787ea3f02666161da86/harp_python-0.4.1.tar.gz", hash = "sha256:232c38c3dbcc714ff0d7bb18423f5c4a843062442f4b27f77571c7071e606eff", size = 15487, upload-time = "2025-04-02T16:20:50.768Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/4c/0b0829ec8444fa995f3719563ff16352ef21c02e665f4f9dc764e085901e/harp_python-0.4.0-py3-none-any.whl", hash = "sha256:1c9f00236dcd9ee4a9ba76087c86ddf5644c20b28b9a211531db9e3897993eea", size = 12599 }, + { url = "https://files.pythonhosted.org/packages/74/58/8a5d1c27b50544957c51bf2a2d5342bedd4ce5cf891bc2e412ce43dd4640/harp_python-0.4.1-py3-none-any.whl", hash = "sha256:0a91396ec19b76a71019b7ed2d9d550aa5c22148095759f706c70b8d808f69dd", size = 12643, upload-time = "2025-04-02T16:20:48.992Z" }, ] [[package]] name = "idna" -version = "3.10" +version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] [[package]] name = "imagesize" version = "1.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, ] [[package]] name = "importlib-resources" version = "6.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, -] - -[[package]] -name = "itsdangerous" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, ] [[package]] @@ -569,27 +665,132 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] -name = "joblib" -version = "1.4.2" +name = "jsonpointer" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, ] [[package]] -name = "jsonpointer" -version = "3.0.0" +name = "ldap3" +version = "2.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/ac/96bd5464e3edbc61595d0d69989f5d9969ae411866427b2500a8e5b812c0/ldap3-2.9.1.tar.gz", hash = "sha256:f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f", size = 398830, upload-time = "2021-07-18T06:34:21.786Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, + { url = "https://files.pythonhosted.org/packages/4e/f6/71d6ec9f18da0b2201287ce9db6afb1a1f637dedb3f0703409558981c723/ldap3-2.9.1-py2.py3-none-any.whl", hash = "sha256:5869596fc4948797020d3f03b7939da938778a0f9e2009f7a072ccf92b8e8d70", size = 432192, upload-time = "2021-07-18T06:34:12.905Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, + { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, + { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, + { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, + { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, + { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" }, ] [[package]] @@ -599,99 +800,132 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - -[[package]] -name = "marshmallow" -version = "3.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] name = "mdit-py-plugins" -version = "0.4.2" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] -name = "mypy-extensions" -version = "1.0.0" +name = "ms-active-directory" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "ldap3" }, + { name = "pyasn1" }, + { name = "pycryptodome" }, + { name = "pytz" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/a0/da7aaa5c87d155f2af60db0db3ab12eec50bfdeeca6f6cd1559ca92375c0/ms_active_directory-1.14.1.tar.gz", hash = "sha256:86c3b9de8b8b5546104f0fe480db689b1a1d0a4109a4208603be4f981ce12040", size = 155782, upload-time = "2024-09-06T01:28:00.609Z" } + +[[package]] +name = "msal" +version = "1.34.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +dependencies = [ + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, + { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, ] [[package]] @@ -706,80 +940,104 @@ dependencies = [ { name = "pyyaml" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] [[package]] name = "numpy" -version = "2.2.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, - { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, - { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, - { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, - { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, - { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, - { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, - { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, - { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, - { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, - { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, - { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, - { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, - { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, - { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, - { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, - { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, - { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, - { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, - { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, - { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, - { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, - { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, - { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, - { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, - { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, - { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, - { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, - { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, - { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, - { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, - { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, - { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, - { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, - { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, - { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, - { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, - { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, - { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, - { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" }, + { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" }, + { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" }, + { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" }, + { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, + { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" }, + { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" }, + { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" }, + { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" }, ] [[package]] name = "packaging" -version = "24.2" +version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -787,145 +1045,317 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/5d/bdb09489b63cd34a976cc9e2a8d938114f7a53a74d3dd4f125ffa49dce82/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", size = 2495152, upload-time = "2025-05-17T17:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/7840250ed4cc0039c433cd41715536f926d6e86ce84e904068eb3244b6a6/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", size = 1639348, upload-time = "2025-05-17T17:20:23.171Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/991da24c55c1f688d6a3b5a11940567353f74590734ee4a64294834ae472/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", size = 2184033, upload-time = "2025-05-17T17:20:25.424Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/0e11882deddf00f68b68dd4e8e442ddc30641f31afeb2bc25588124ac8de/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7", size = 2270142, upload-time = "2025-05-17T17:20:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fc/4347fea23a3f95ffb931f383ff28b3f7b1fe868739182cb76718c0da86a1/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", size = 2309384, upload-time = "2025-05-17T17:20:30.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d9/c5261780b69ce66d8cfab25d2797bd6e82ba0241804694cd48be41add5eb/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", size = 2183237, upload-time = "2025-05-17T17:20:33.736Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6f/3af2ffedd5cfa08c631f89452c6648c4d779e7772dfc388c77c920ca6bbf/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", size = 2343898, upload-time = "2025-05-17T17:20:36.086Z" }, + { url = "https://files.pythonhosted.org/packages/9a/dc/9060d807039ee5de6e2f260f72f3d70ac213993a804f5e67e0a73a56dd2f/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", size = 2269197, upload-time = "2025-05-17T17:20:38.414Z" }, + { url = "https://files.pythonhosted.org/packages/f9/34/e6c8ca177cb29dcc4967fef73f5de445912f93bd0343c9c33c8e5bf8cde8/pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", size = 1768600, upload-time = "2025-05-17T17:20:40.688Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1d/89756b8d7ff623ad0160f4539da571d1f594d21ee6d68be130a6eccb39a4/pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", size = 1799740, upload-time = "2025-05-17T17:20:42.413Z" }, + { url = "https://files.pythonhosted.org/packages/5d/61/35a64f0feaea9fd07f0d91209e7be91726eb48c0f1bfc6720647194071e4/pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", size = 1703685, upload-time = "2025-05-17T17:20:44.388Z" }, + { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + +[[package]] +name = "pycryptodomex" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/85/e24bf90972a30b0fcd16c73009add1d7d7cd9140c2498a68252028899e41/pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da", size = 4922157, upload-time = "2025-05-17T17:23:41.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/00/10edb04777069a42490a38c137099d4b17ba6e36a4e6e28bdc7470e9e853/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7b37e08e3871efe2187bc1fd9320cc81d87caf19816c648f24443483005ff886", size = 2498764, upload-time = "2025-05-17T17:22:21.453Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3f/2872a9c2d3a27eac094f9ceaa5a8a483b774ae69018040ea3240d5b11154/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:91979028227543010d7b2ba2471cf1d1e398b3f183cb105ac584df0c36dac28d", size = 1643012, upload-time = "2025-05-17T17:22:23.702Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/774c2e2b4f6570fbf6a4972161adbb183aeeaa1863bde31e8706f123bf92/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8962204c47464d5c1c4038abeadd4514a133b28748bcd9fa5b6d62e3cec6fa", size = 2187643, upload-time = "2025-05-17T17:22:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/de/a3/71065b24cb889d537954cedc3ae5466af00a2cabcff8e29b73be047e9a19/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a33986a0066860f7fcf7c7bd2bc804fa90e434183645595ae7b33d01f3c91ed8", size = 2273762, upload-time = "2025-05-17T17:22:28.313Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0b/ff6f43b7fbef4d302c8b981fe58467b8871902cdc3eb28896b52421422cc/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7947ab8d589e3178da3d7cdeabe14f841b391e17046954f2fbcd941705762b5", size = 2313012, upload-time = "2025-05-17T17:22:30.57Z" }, + { url = "https://files.pythonhosted.org/packages/02/de/9d4772c0506ab6da10b41159493657105d3f8bb5c53615d19452afc6b315/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c25e30a20e1b426e1f0fa00131c516f16e474204eee1139d1603e132acffc314", size = 2186856, upload-time = "2025-05-17T17:22:32.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/ad/8b30efcd6341707a234e5eba5493700a17852ca1ac7a75daa7945fcf6427/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:da4fa650cef02db88c2b98acc5434461e027dce0ae8c22dd5a69013eaf510006", size = 2347523, upload-time = "2025-05-17T17:22:35.386Z" }, + { url = "https://files.pythonhosted.org/packages/0f/02/16868e9f655b7670dbb0ac4f2844145cbc42251f916fc35c414ad2359849/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58b851b9effd0d072d4ca2e4542bf2a4abcf13c82a29fd2c93ce27ee2a2e9462", size = 2272825, upload-time = "2025-05-17T17:22:37.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/18/4ca89ac737230b52ac8ffaca42f9c6f1fd07c81a6cd821e91af79db60632/pycryptodomex-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:a9d446e844f08299236780f2efa9898c818fe7e02f17263866b8550c7d5fb328", size = 1772078, upload-time = "2025-05-17T17:22:40Z" }, + { url = "https://files.pythonhosted.org/packages/73/34/13e01c322db027682e00986873eca803f11c56ade9ba5bbf3225841ea2d4/pycryptodomex-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bc65bdd9fc8de7a35a74cab1c898cab391a4add33a8fe740bda00f5976ca4708", size = 1803656, upload-time = "2025-05-17T17:22:42.139Z" }, + { url = "https://files.pythonhosted.org/packages/54/68/9504c8796b1805d58f4425002bcca20f12880e6fa4dc2fc9a668705c7a08/pycryptodomex-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c885da45e70139464f082018ac527fdaad26f1657a99ee13eecdce0f0ca24ab4", size = 1707172, upload-time = "2025-05-17T17:22:44.704Z" }, + { url = "https://files.pythonhosted.org/packages/dd/9c/1a8f35daa39784ed8adf93a694e7e5dc15c23c741bbda06e1d45f8979e9e/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:06698f957fe1ab229a99ba2defeeae1c09af185baa909a31a5d1f9d42b1aaed6", size = 2499240, upload-time = "2025-05-17T17:22:46.953Z" }, + { url = "https://files.pythonhosted.org/packages/7a/62/f5221a191a97157d240cf6643747558759126c76ee92f29a3f4aee3197a5/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2c2537863eccef2d41061e82a881dcabb04944c5c06c5aa7110b577cc487545", size = 1644042, upload-time = "2025-05-17T17:22:49.098Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fd/5a054543c8988d4ed7b612721d7e78a4b9bf36bc3c5ad45ef45c22d0060e/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43c446e2ba8df8889e0e16f02211c25b4934898384c1ec1ec04d7889c0333587", size = 2186227, upload-time = "2025-05-17T17:22:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a9/8862616a85cf450d2822dbd4fff1fcaba90877907a6ff5bc2672cafe42f8/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f489c4765093fb60e2edafdf223397bc716491b2b69fe74367b70d6999257a5c", size = 2272578, upload-time = "2025-05-17T17:22:53.676Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/bda9c49a7c1842820de674ab36c79f4fbeeee03f8ff0e4f3546c3889076b/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdc69d0d3d989a1029df0eed67cc5e8e5d968f3724f4519bd03e0ec68df7543c", size = 2312166, upload-time = "2025-05-17T17:22:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/03/cc/870b9bf8ca92866ca0186534801cf8d20554ad2a76ca959538041b7a7cf4/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bbcb1dd0f646484939e142462d9e532482bc74475cecf9c4903d4e1cd21f003", size = 2185467, upload-time = "2025-05-17T17:22:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/96/e3/ce9348236d8e669fea5dd82a90e86be48b9c341210f44e25443162aba187/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:8a4fcd42ccb04c31268d1efeecfccfd1249612b4de6374205376b8f280321744", size = 2346104, upload-time = "2025-05-17T17:23:02.112Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e869bcee87beb89040263c416a8a50204f7f7a83ac11897646c9e71e0daf/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:55ccbe27f049743a4caf4f4221b166560d3438d0b1e5ab929e07ae1702a4d6fd", size = 2271038, upload-time = "2025-05-17T17:23:04.872Z" }, + { url = "https://files.pythonhosted.org/packages/8d/67/09ee8500dd22614af5fbaa51a4aee6e342b5fa8aecf0a6cb9cbf52fa6d45/pycryptodomex-3.23.0-cp37-abi3-win32.whl", hash = "sha256:189afbc87f0b9f158386bf051f720e20fa6145975f1e76369303d0f31d1a8d7c", size = 1771969, upload-time = "2025-05-17T17:23:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/69/96/11f36f71a865dd6df03716d33bd07a67e9d20f6b8d39820470b766af323c/pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:52e5ca58c3a0b0bd5e100a9fbc8015059b05cffc6c66ce9d98b4b45e023443b9", size = 1803124, upload-time = "2025-05-17T17:23:09.267Z" }, + { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" }, ] [[package]] name = "pydantic" -version = "2.10.6" +version = "2.12.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/1e/4f0a3233767010308f2fd6bd0814597e3f63f1dc98304a9112b8759df4ff/pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74", size = 819383, upload-time = "2025-10-17T15:04:21.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, + { url = "https://files.pythonhosted.org/packages/a1/6b/83661fa77dcefa195ad5f8cd9af3d1a7450fd57cc883ad04d65446ac2029/pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf", size = 462431, upload-time = "2025-10-17T15:04:19.346Z" }, ] [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.41.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/4c/f6cbfa1e8efacd00b846764e8484fe173d25b8dab881e277a619177f3384/pydantic_core-2.41.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:28ff11666443a1a8cf2a044d6a545ebffa8382b5f7973f22c36109205e65dc80", size = 2109062, upload-time = "2025-10-14T10:20:04.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/f8/40b72d3868896bfcd410e1bd7e516e762d326201c48e5b4a06446f6cf9e8/pydantic_core-2.41.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61760c3925d4633290292bad462e0f737b840508b4f722247d8729684f6539ae", size = 1916301, upload-time = "2025-10-14T10:20:06.857Z" }, + { url = "https://files.pythonhosted.org/packages/94/4d/d203dce8bee7faeca791671c88519969d98d3b4e8f225da5b96dad226fc8/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae547b7315d055b0de2ec3965643b0ab82ad0106a7ffd29615ee9f266a02827", size = 1968728, upload-time = "2025-10-14T10:20:08.353Z" }, + { url = "https://files.pythonhosted.org/packages/65/f5/6a66187775df87c24d526985b3a5d78d861580ca466fbd9d4d0e792fcf6c/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef9ee5471edd58d1fcce1c80ffc8783a650e3e3a193fe90d52e43bb4d87bff1f", size = 2050238, upload-time = "2025-10-14T10:20:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b9/78336345de97298cf53236b2f271912ce11f32c1e59de25a374ce12f9cce/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15dd504af121caaf2c95cb90c0ebf71603c53de98305621b94da0f967e572def", size = 2249424, upload-time = "2025-10-14T10:20:11.732Z" }, + { url = "https://files.pythonhosted.org/packages/99/bb/a4584888b70ee594c3d374a71af5075a68654d6c780369df269118af7402/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a926768ea49a8af4d36abd6a8968b8790f7f76dd7cbd5a4c180db2b4ac9a3a2", size = 2366047, upload-time = "2025-10-14T10:20:13.647Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8d/17fc5de9d6418e4d2ae8c675f905cdafdc59d3bf3bf9c946b7ab796a992a/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916b9b7d134bff5440098a4deb80e4cb623e68974a87883299de9124126c2a8", size = 2071163, upload-time = "2025-10-14T10:20:15.307Z" }, + { url = "https://files.pythonhosted.org/packages/54/e7/03d2c5c0b8ed37a4617430db68ec5e7dbba66358b629cd69e11b4d564367/pydantic_core-2.41.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cf90535979089df02e6f17ffd076f07237efa55b7343d98760bde8743c4b265", size = 2190585, upload-time = "2025-10-14T10:20:17.3Z" }, + { url = "https://files.pythonhosted.org/packages/be/fc/15d1c9fe5ad9266a5897d9b932b7f53d7e5cfc800573917a2c5d6eea56ec/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7533c76fa647fade2d7ec75ac5cc079ab3f34879626dae5689b27790a6cf5a5c", size = 2150109, upload-time = "2025-10-14T10:20:19.143Z" }, + { url = "https://files.pythonhosted.org/packages/26/ef/e735dd008808226c83ba56972566138665b71477ad580fa5a21f0851df48/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:37e516bca9264cbf29612539801ca3cd5d1be465f940417b002905e6ed79d38a", size = 2315078, upload-time = "2025-10-14T10:20:20.742Z" }, + { url = "https://files.pythonhosted.org/packages/90/00/806efdcf35ff2ac0f938362350cd9827b8afb116cc814b6b75cf23738c7c/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c19cb355224037c83642429b8ce261ae108e1c5fbf5c028bac63c77b0f8646e", size = 2318737, upload-time = "2025-10-14T10:20:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/41/7e/6ac90673fe6cb36621a2283552897838c020db343fa86e513d3f563b196f/pydantic_core-2.41.4-cp311-cp311-win32.whl", hash = "sha256:09c2a60e55b357284b5f31f5ab275ba9f7f70b7525e18a132ec1f9160b4f1f03", size = 1974160, upload-time = "2025-10-14T10:20:23.817Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9d/7c5e24ee585c1f8b6356e1d11d40ab807ffde44d2db3b7dfd6d20b09720e/pydantic_core-2.41.4-cp311-cp311-win_amd64.whl", hash = "sha256:711156b6afb5cb1cb7c14a2cc2c4a8b4c717b69046f13c6b332d8a0a8f41ca3e", size = 2021883, upload-time = "2025-10-14T10:20:25.48Z" }, + { url = "https://files.pythonhosted.org/packages/33/90/5c172357460fc28b2871eb4a0fb3843b136b429c6fa827e4b588877bf115/pydantic_core-2.41.4-cp311-cp311-win_arm64.whl", hash = "sha256:6cb9cf7e761f4f8a8589a45e49ed3c0d92d1d696a45a6feaee8c904b26efc2db", size = 1968026, upload-time = "2025-10-14T10:20:27.039Z" }, + { url = "https://files.pythonhosted.org/packages/e9/81/d3b3e95929c4369d30b2a66a91db63c8ed0a98381ae55a45da2cd1cc1288/pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887", size = 2099043, upload-time = "2025-10-14T10:20:28.561Z" }, + { url = "https://files.pythonhosted.org/packages/58/da/46fdac49e6717e3a94fc9201403e08d9d61aa7a770fab6190b8740749047/pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2", size = 1910699, upload-time = "2025-10-14T10:20:30.217Z" }, + { url = "https://files.pythonhosted.org/packages/1e/63/4d948f1b9dd8e991a5a98b77dd66c74641f5f2e5225fee37994b2e07d391/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999", size = 1952121, upload-time = "2025-10-14T10:20:32.246Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a7/e5fc60a6f781fc634ecaa9ecc3c20171d238794cef69ae0af79ac11b89d7/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4", size = 2041590, upload-time = "2025-10-14T10:20:34.332Z" }, + { url = "https://files.pythonhosted.org/packages/70/69/dce747b1d21d59e85af433428978a1893c6f8a7068fa2bb4a927fba7a5ff/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f", size = 2219869, upload-time = "2025-10-14T10:20:35.965Z" }, + { url = "https://files.pythonhosted.org/packages/83/6a/c070e30e295403bf29c4df1cb781317b6a9bac7cd07b8d3acc94d501a63c/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b", size = 2345169, upload-time = "2025-10-14T10:20:37.627Z" }, + { url = "https://files.pythonhosted.org/packages/f0/83/06d001f8043c336baea7fd202a9ac7ad71f87e1c55d8112c50b745c40324/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47", size = 2070165, upload-time = "2025-10-14T10:20:39.246Z" }, + { url = "https://files.pythonhosted.org/packages/14/0a/e567c2883588dd12bcbc110232d892cf385356f7c8a9910311ac997ab715/pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970", size = 2189067, upload-time = "2025-10-14T10:20:41.015Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1d/3d9fca34273ba03c9b1c5289f7618bc4bd09c3ad2289b5420481aa051a99/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed", size = 2132997, upload-time = "2025-10-14T10:20:43.106Z" }, + { url = "https://files.pythonhosted.org/packages/52/70/d702ef7a6cd41a8afc61f3554922b3ed8d19dd54c3bd4bdbfe332e610827/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8", size = 2307187, upload-time = "2025-10-14T10:20:44.849Z" }, + { url = "https://files.pythonhosted.org/packages/68/4c/c06be6e27545d08b802127914156f38d10ca287a9e8489342793de8aae3c/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431", size = 2305204, upload-time = "2025-10-14T10:20:46.781Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e5/35ae4919bcd9f18603419e23c5eaf32750224a89d41a8df1a3704b69f77e/pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd", size = 1972536, upload-time = "2025-10-14T10:20:48.39Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/49c5bb6d2a49eb2ee3647a93e3dae7080c6409a8a7558b075027644e879c/pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff", size = 2031132, upload-time = "2025-10-14T10:20:50.421Z" }, + { url = "https://files.pythonhosted.org/packages/06/23/936343dbcba6eec93f73e95eb346810fc732f71ba27967b287b66f7b7097/pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8", size = 1969483, upload-time = "2025-10-14T10:20:52.35Z" }, + { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" }, + { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" }, + { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" }, + { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" }, + { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" }, + { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" }, + { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" }, + { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" }, + { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" }, + { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" }, + { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" }, + { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" }, + { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" }, + { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" }, + { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" }, + { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" }, + { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" }, + { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" }, + { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" }, + { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" }, + { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" }, + { url = "https://files.pythonhosted.org/packages/b0/12/5ba58daa7f453454464f92b3ca7b9d7c657d8641c48e370c3ebc9a82dd78/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a1b2cfec3879afb742a7b0bcfa53e4f22ba96571c9e54d6a3afe1052d17d843b", size = 2122139, upload-time = "2025-10-14T10:22:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/21/fb/6860126a77725c3108baecd10fd3d75fec25191d6381b6eb2ac660228eac/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:d175600d975b7c244af6eb9c9041f10059f20b8bbffec9e33fdd5ee3f67cdc42", size = 1936674, upload-time = "2025-10-14T10:22:49.555Z" }, + { url = "https://files.pythonhosted.org/packages/de/be/57dcaa3ed595d81f8757e2b44a38240ac5d37628bce25fb20d02c7018776/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f184d657fa4947ae5ec9c47bd7e917730fa1cbb78195037e32dcbab50aca5ee", size = 1956398, upload-time = "2025-10-14T10:22:52.19Z" }, + { url = "https://files.pythonhosted.org/packages/2f/1d/679a344fadb9695f1a6a294d739fbd21d71fa023286daeea8c0ed49e7c2b/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed810568aeffed3edc78910af32af911c835cc39ebbfacd1f0ab5dd53028e5c", size = 2138674, upload-time = "2025-10-14T10:22:54.499Z" }, + { url = "https://files.pythonhosted.org/packages/c4/48/ae937e5a831b7c0dc646b2ef788c27cd003894882415300ed21927c21efa/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537", size = 2112087, upload-time = "2025-10-14T10:22:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/5e/db/6db8073e3d32dae017da7e0d16a9ecb897d0a4d92e00634916e486097961/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94", size = 1920387, upload-time = "2025-10-14T10:22:59.342Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c1/dd3542d072fcc336030d66834872f0328727e3b8de289c662faa04aa270e/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c", size = 1951495, upload-time = "2025-10-14T10:23:02.089Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c6/db8d13a1f8ab3f1eb08c88bd00fd62d44311e3456d1e85c0e59e0a0376e7/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335", size = 2139008, upload-time = "2025-10-14T10:23:04.539Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7d/138e902ed6399b866f7cfe4435d22445e16fff888a1c00560d9dc79a780f/pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:491535d45cd7ad7e4a2af4a5169b0d07bebf1adfd164b0368da8aa41e19907a5", size = 2104721, upload-time = "2025-10-14T10:23:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/47/13/0525623cf94627f7b53b4c2034c81edc8491cbfc7c28d5447fa318791479/pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:54d86c0cada6aba4ec4c047d0e348cbad7063b87ae0f005d9f8c9ad04d4a92a2", size = 1931608, upload-time = "2025-10-14T10:23:29.306Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f9/744bc98137d6ef0a233f808bfc9b18cf94624bf30836a18d3b05d08bf418/pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca1124aced216b2500dc2609eade086d718e8249cb9696660ab447d50a758bd", size = 2132986, upload-time = "2025-10-14T10:23:32.057Z" }, + { url = "https://files.pythonhosted.org/packages/17/c8/629e88920171173f6049386cc71f893dff03209a9ef32b4d2f7e7c264bcf/pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c9024169becccf0cb470ada03ee578d7348c119a0d42af3dcf9eda96e3a247c", size = 2187516, upload-time = "2025-10-14T10:23:34.871Z" }, + { url = "https://files.pythonhosted.org/packages/2e/0f/4f2734688d98488782218ca61bcc118329bf5de05bb7fe3adc7dd79b0b86/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:26895a4268ae5a2849269f4991cdc97236e4b9c010e51137becf25182daac405", size = 2146146, upload-time = "2025-10-14T10:23:37.342Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f2/ab385dbd94a052c62224b99cf99002eee99dbec40e10006c78575aead256/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:ca4df25762cf71308c446e33c9b1fdca2923a3f13de616e2a949f38bf21ff5a8", size = 2311296, upload-time = "2025-10-14T10:23:40.145Z" }, + { url = "https://files.pythonhosted.org/packages/fc/8e/e4f12afe1beeb9823bba5375f8f258df0cc61b056b0195fb1cf9f62a1a58/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5a28fcedd762349519276c36634e71853b4541079cab4acaaac60c4421827308", size = 2315386, upload-time = "2025-10-14T10:23:42.624Z" }, + { url = "https://files.pythonhosted.org/packages/48/f7/925f65d930802e3ea2eb4d5afa4cb8730c8dc0d2cb89a59dc4ed2fcb2d74/pydantic_core-2.41.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c173ddcd86afd2535e2b695217e82191580663a1d1928239f877f5a1649ef39f", size = 2147775, upload-time = "2025-10-14T10:23:45.406Z" }, ] [[package]] name = "pydantic-settings" -version = "2.8.1" +version = "2.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } +sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, + { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, ] [[package]] name = "pydantic-yaml" -version = "1.4.0" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "ruamel-yaml" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/b8/19446b74d31a6ff09eb69af3be01c5031c8bf5dc62e4205a22d50d629333/pydantic_yaml-1.4.0.tar.gz", hash = "sha256:09f6b9ec9d80550dd3a58596a6a0948a1830fae94b73329b95c2b9dbfc35ae00", size = 21454 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6c/6bc8f39406cdeed864578df88f52a63db27bd24aa8473206d650bc4fa1d8/pydantic_yaml-1.6.0.tar.gz", hash = "sha256:ce5f10b65d95ca45846a36ea8dae54e550fa3058e7d6218e0179184d9bf6f660", size = 25782, upload-time = "2025-08-08T21:01:13.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/e1/e4b108753491a6545c66cdd7546e726b056bbe3902f9ef8a58ed118afd70/pydantic_yaml-1.4.0-py3-none-any.whl", hash = "sha256:f9ad82d8c0548e779e00d6ec639f6efa8f8c7e14d12d0bf9fdc400a37300d7ba", size = 17926 }, + { url = "https://files.pythonhosted.org/packages/ba/39/8d263fbcb409a8f5dd78ac8f89f1e6af1d4e4d9fbb7f856ca3245b354809/pydantic_yaml-1.6.0-py3-none-any.whl", hash = "sha256:02cb800b455b68daeeb74ad736c252a94a0b203da5fbbeef02539d468e1d98f8", size = 22511, upload-time = "2025-08-08T21:01:11.425Z" }, ] [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[package]] name = "pygraphviz" version = "1.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b08e1f5aea12468ef334f0732c65cbb18df2a7f285c87/pygraphviz-1.14.tar.gz", hash = "sha256:c10df02377f4e39b00ae17c862f4ee7e5767317f1c6b2dfd04cea6acc7fc2bea", size = 106003 } +sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b08e1f5aea12468ef334f0732c65cbb18df2a7f285c87/pygraphviz-1.14.tar.gz", hash = "sha256:c10df02377f4e39b00ae17c862f4ee7e5767317f1c6b2dfd04cea6acc7fc2bea", size = 106003, upload-time = "2024-09-29T18:31:12.471Z" } + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pykeepass" +version = "4.1.1.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi" }, + { name = "construct" }, + { name = "lxml" }, + { name = "pycryptodomex" }, + { name = "pyotp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/1d/0e909a73eb95cc21b2048685f59d028d2bbac7b3365a2ac2cca6aad53de9/pykeepass-4.1.1.post1.tar.gz", hash = "sha256:28f4927454ebe507ef7294d3ec6b5a72ee3a5c97fcc21b1080b8ddc09f2097dd", size = 55429, upload-time = "2025-03-06T00:41:58.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/04/6cf0687780c68e7fb0525e7210ec5477987c0481904f600c2e5d81bbb7dd/pykeepass-4.1.1.post1-py3-none-any.whl", hash = "sha256:4cfd54f376cb1f58dd8f11fbe7923282bc7dd97ffdf1bb622004a6e718bfe379", size = 55584, upload-time = "2025-03-06T00:41:57.201Z" }, +] + +[[package]] +name = "pyotp" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/b2/1d5994ba2acde054a443bd5e2d384175449c7d2b6d1a0614dbca3a63abfc/pyotp-2.9.0.tar.gz", hash = "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63", size = 17763, upload-time = "2023-07-27T23:41:03.295Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/c0/c33c8792c3e50193ef55adb95c1c3c2786fe281123291c2dbf0eaab95a6f/pyotp-2.9.0-py3-none-any.whl", hash = "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612", size = 13376, upload-time = "2023-07-27T23:41:01.685Z" }, +] [[package]] name = "python-dateutil" @@ -934,67 +1364,87 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, ] [[package]] name = "pytz" -version = "2025.1" +version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] name = "requests" -version = "2.32.3" +version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1002,296 +1452,193 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "oauthlib" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] -name = "requests-toolbelt" -version = "1.0.0" +name = "rich" +version = "14.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, + { name = "markdown-it-py" }, + { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, ] [[package]] -name = "rich" -version = "13.9.4" +name = "roman-numerals-py" +version = "3.1.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, ] [[package]] name = "ruamel-yaml" -version = "0.18.10" +version = "0.18.16" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.13' and platform_python_implementation == 'CPython'" }, + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447 } +sdist = { url = "https://files.pythonhosted.org/packages/9f/c7/ee630b29e04a672ecfc9b63227c87fd7a37eb67c1bf30fe95376437f897c/ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a", size = 147269, upload-time = "2025-10-22T17:54:02.346Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729 }, + { url = "https://files.pythonhosted.org/packages/0f/73/bb1bc2529f852e7bf64a2dec885e89ff9f5cc7bbf6c9340eed30ff2c69c5/ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba", size = 119858, upload-time = "2025-10-22T17:53:59.012Z" }, ] [[package]] name = "ruamel-yaml-clib" -version = "0.2.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224 }, - { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480 }, - { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068 }, - { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012 }, - { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352 }, - { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344 }, - { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498 }, - { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205 }, - { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185 }, - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e9/39ec4d4b3f91188fad1842748f67d4e749c77c37e353c4e545052ee8e893/ruamel.yaml.clib-0.2.14.tar.gz", hash = "sha256:803f5044b13602d58ea378576dd75aa759f52116a0232608e8fdada4da33752e", size = 225394, upload-time = "2025-09-22T19:51:23.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/9f/3c51e9578b8c36fcc4bdd271a1a5bb65963a74a4b6ad1a989768a22f6c2a/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bae1a073ca4244620425cd3d3aa9746bde590992b98ee8c7c8be8c597ca0d4e", size = 270207, upload-time = "2025-09-23T14:24:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/4a/16/cb02815bc2ae9c66760c0c061d23c7358f9ba51dae95ac85247662b7fbe2/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0a54e5e40a7a691a426c2703b09b0d61a14294d25cfacc00631aa6f9c964df0d", size = 137780, upload-time = "2025-09-22T19:50:37.734Z" }, + { url = "https://files.pythonhosted.org/packages/31/c6/fc687cd1b93bff8e40861eea46d6dc1a6a778d9a085684e4045ff26a8e40/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10d9595b6a19778f3269399eff6bab642608e5966183abc2adbe558a42d4efc9", size = 641590, upload-time = "2025-09-22T19:50:41.978Z" }, + { url = "https://files.pythonhosted.org/packages/45/5d/65a2bc08b709b08576b3f307bf63951ee68a8e047cbbda6f1c9864ecf9a7/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba72975485f2b87b786075e18a6e5d07dc2b4d8973beb2732b9b2816f1bad70", size = 738090, upload-time = "2025-09-22T19:50:39.152Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d0/a70a03614d9a6788a3661ab1538879ed2aae4e84d861f101243116308a37/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29757bdb7c142f9595cc1b62ec49a3d1c83fab9cef92db52b0ccebaad4eafb98", size = 700744, upload-time = "2025-09-22T19:50:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/77/30/c93fa457611f79946d5cb6cc97493ca5425f3f21891d7b1f9b44eaa1b38e/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:557df28dbccf79b152fe2d1b935f6063d9cc431199ea2b0e84892f35c03bb0ee", size = 742321, upload-time = "2025-09-23T18:42:48.916Z" }, + { url = "https://files.pythonhosted.org/packages/40/85/e2c54ad637117cd13244a4649946eaa00f32edcb882d1f92df90e079ab00/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:26a8de280ab0d22b6e3ec745b4a5a07151a0f74aad92dd76ab9c8d8d7087720d", size = 743805, upload-time = "2025-09-22T19:50:43.58Z" }, + { url = "https://files.pythonhosted.org/packages/81/50/f899072c38877d8ef5382e0b3d47f8c4346226c1f52d6945d6f64fec6a2f/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e501c096aa3889133d674605ebd018471bc404a59cbc17da3c5924421c54d97c", size = 769529, upload-time = "2025-09-22T19:50:45.707Z" }, + { url = "https://files.pythonhosted.org/packages/99/7c/96d4b5075e30c65ea2064e40c2d657c7c235d7b6ef18751cf89a935b9041/ruamel.yaml.clib-0.2.14-cp311-cp311-win32.whl", hash = "sha256:915748cfc25b8cfd81b14d00f4bfdb2ab227a30d6d43459034533f4d1c207a2a", size = 100256, upload-time = "2025-09-22T19:50:48.26Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8c/73ee2babd04e8bfcf1fd5c20aa553d18bf0ebc24b592b4f831d12ae46cc0/ruamel.yaml.clib-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:4ccba93c1e5a40af45b2f08e4591969fa4697eae951c708f3f83dcbf9f6c6bb1", size = 118234, upload-time = "2025-09-22T19:50:47.019Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/ccfb34a25289afbbc42017e4d3d4288e61d35b2e00cfc6b92974a6a1f94b/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6aeadc170090ff1889f0d2c3057557f9cd71f975f17535c26a5d37af98f19c27", size = 271775, upload-time = "2025-09-23T14:24:12.771Z" }, + { url = "https://files.pythonhosted.org/packages/82/73/e628a92e80197ff6a79ab81ec3fa00d4cc082d58ab78d3337b7ba7043301/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5e56ac47260c0eed992789fa0b8efe43404a9adb608608631a948cee4fc2b052", size = 138842, upload-time = "2025-09-22T19:50:49.156Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c5/346c7094344a60419764b4b1334d9e0285031c961176ff88ffb652405b0c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a911aa73588d9a8b08d662b9484bc0567949529824a55d3885b77e8dd62a127a", size = 647404, upload-time = "2025-09-22T19:50:52.921Z" }, + { url = "https://files.pythonhosted.org/packages/df/99/65080c863eb06d4498de3d6c86f3e90595e02e159fd8529f1565f56cfe2c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05ba88adf3d7189a974b2de7a9d56731548d35dc0a822ec3dc669caa7019b29", size = 753141, upload-time = "2025-09-22T19:50:50.294Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e3/0de85f3e3333f8e29e4b10244374a202a87665d1131798946ee22cf05c7c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb04c5650de6668b853623eceadcdb1a9f2fee381f5d7b6bc842ee7c239eeec4", size = 703477, upload-time = "2025-09-22T19:50:51.508Z" }, + { url = "https://files.pythonhosted.org/packages/d9/25/0d2f09d8833c7fd77ab8efeff213093c16856479a9d293180a0d89f6bed9/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df3ec9959241d07bc261f4983d25a1205ff37703faf42b474f15d54d88b4f8c9", size = 741157, upload-time = "2025-09-23T18:42:50.408Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8c/959f10c2e2153cbdab834c46e6954b6dd9e3b109c8f8c0a3cf1618310985/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbc08c02e9b147a11dfcaa1ac8a83168b699863493e183f7c0c8b12850b7d259", size = 745859, upload-time = "2025-09-22T19:50:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6b/e580a7c18b485e1a5f30a32cda96b20364b0ba649d9d2baaf72f8bd21f83/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c099cafc1834d3c5dac305865d04235f7c21c167c8dd31ebc3d6bbc357e2f023", size = 770200, upload-time = "2025-09-22T19:50:55.718Z" }, + { url = "https://files.pythonhosted.org/packages/ef/44/3455eebc761dc8e8fdced90f2b0a3fa61e32ba38b50de4130e2d57db0f21/ruamel.yaml.clib-0.2.14-cp312-cp312-win32.whl", hash = "sha256:b5b0f7e294700b615a3bcf6d28b26e6da94e8eba63b079f4ec92e9ba6c0d6b54", size = 98829, upload-time = "2025-09-22T19:50:58.895Z" }, + { url = "https://files.pythonhosted.org/packages/76/ab/5121f7f3b651db93de546f8c982c241397aad0a4765d793aca1dac5eadee/ruamel.yaml.clib-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:a37f40a859b503304dd740686359fcf541d6fb3ff7fc10f539af7f7150917c68", size = 115570, upload-time = "2025-09-22T19:50:57.981Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ae/e3811f05415594025e96000349d3400978adaed88d8f98d494352d9761ee/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7e4f9da7e7549946e02a6122dcad00b7c1168513acb1f8a726b1aaf504a99d32", size = 269205, upload-time = "2025-09-23T14:24:15.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/06/7d51f4688d6d72bb72fa74254e1593c4f5ebd0036be5b41fe39315b275e9/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:dd7546c851e59c06197a7c651335755e74aa383a835878ca86d2c650c07a2f85", size = 137417, upload-time = "2025-09-22T19:50:59.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/08/b4499234a420ef42960eeb05585df5cc7eb25ccb8c980490b079e6367050/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1c1acc3a0209ea9042cc3cfc0790edd2eddd431a2ec3f8283d081e4d5018571e", size = 642558, upload-time = "2025-09-22T19:51:03.388Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ba/1975a27dedf1c4c33306ee67c948121be8710b19387aada29e2f139c43ee/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2070bf0ad1540d5c77a664de07ebcc45eebd1ddcab71a7a06f26936920692beb", size = 744087, upload-time = "2025-09-22T19:51:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/20/15/8a19a13d27f3bd09fa18813add8380a29115a47b553845f08802959acbce/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd8fe07f49c170e09d76773fb86ad9135e0beee44f36e1576a201b0676d3d1d", size = 699709, upload-time = "2025-09-22T19:51:02.075Z" }, + { url = "https://files.pythonhosted.org/packages/19/ee/8d6146a079ad21e534b5083c9ee4a4c8bec42f79cf87594b60978286b39a/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff86876889ea478b1381089e55cf9e345707b312beda4986f823e1d95e8c0f59", size = 708926, upload-time = "2025-09-23T18:42:51.707Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/426b714abdc222392e68f3b8ad323930d05a214a27c7e7a0f06c69126401/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1f118b707eece8cf84ecbc3e3ec94d9db879d85ed608f95870d39b2d2efa5dca", size = 740202, upload-time = "2025-09-22T19:51:04.673Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ac/3c5c2b27a183f4fda8a57c82211721c016bcb689a4a175865f7646db9f94/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b30110b29484adc597df6bd92a37b90e63a8c152ca8136aad100a02f8ba6d1b6", size = 765196, upload-time = "2025-09-22T19:51:05.916Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/06f56a71fd55021c993ed6e848c9b2e5e9cfce180a42179f0ddd28253f7c/ruamel.yaml.clib-0.2.14-cp313-cp313-win32.whl", hash = "sha256:f4e97a1cf0b7a30af9e1d9dad10a5671157b9acee790d9e26996391f49b965a2", size = 98635, upload-time = "2025-09-22T19:51:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/76aba16a1689b50528224b182f71097ece338e7a4ab55e84c2e73443b78a/ruamel.yaml.clib-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:090782b5fb9d98df96509eecdbcaffd037d47389a89492320280d52f91330d78", size = 115238, upload-time = "2025-09-22T19:51:07.081Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/a59ff65c26aaf21a24eb38df777cb9af5d87ba8fc8107c163c2da9d1e85e/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7df6f6e9d0e33c7b1d435defb185095386c469109de723d514142632a7b9d07f", size = 271441, upload-time = "2025-09-23T14:24:16.498Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fa/3234f913fe9a6525a7b97c6dad1f51e72b917e6872e051a5e2ffd8b16fbb/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83", size = 137970, upload-time = "2025-09-22T19:51:09.472Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ec/4edbf17ac2c87fa0845dd366ef8d5852b96eb58fcd65fc1ecf5fe27b4641/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27", size = 739639, upload-time = "2025-09-22T19:51:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/15/18/b0e1fafe59051de9e79cdd431863b03593ecfa8341c110affad7c8121efc/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640", size = 764456, upload-time = "2025-09-22T19:51:11.736Z" }, ] [[package]] name = "ruff" -version = "0.11.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 }, - { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 }, - { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 }, - { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 }, - { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 }, - { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 }, - { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 }, - { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 }, - { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 }, - { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 }, - { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 }, - { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 }, - { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 }, - { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 }, - { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 }, - { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 }, - { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, -] - -[[package]] -name = "scikit-learn" -version = "1.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/2a/e291c29670795406a824567d1dfc91db7b699799a002fdaa452bceea8f6e/scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33", size = 12102620 }, - { url = "https://files.pythonhosted.org/packages/25/92/ee1d7a00bb6b8c55755d4984fd82608603a3cc59959245068ce32e7fb808/scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d", size = 11116234 }, - { url = "https://files.pythonhosted.org/packages/30/cd/ed4399485ef364bb25f388ab438e3724e60dc218c547a407b6e90ccccaef/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2", size = 12592155 }, - { url = "https://files.pythonhosted.org/packages/a8/f3/62fc9a5a659bb58a03cdd7e258956a5824bdc9b4bb3c5d932f55880be569/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8", size = 13497069 }, - { url = "https://files.pythonhosted.org/packages/a1/a6/c5b78606743a1f28eae8f11973de6613a5ee87366796583fb74c67d54939/scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415", size = 11139809 }, - { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516 }, - { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837 }, - { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728 }, - { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700 }, - { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613 }, - { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001 }, - { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360 }, - { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004 }, - { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776 }, - { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865 }, - { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804 }, - { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530 }, - { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852 }, - { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256 }, -] - -[[package]] -name = "scipy" -version = "1.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/1f/bf0a5f338bda7c35c08b4ed0df797e7bafe8a78a97275e9f439aceb46193/scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", size = 38703651 }, - { url = "https://files.pythonhosted.org/packages/de/54/db126aad3874601048c2c20ae3d8a433dbfd7ba8381551e6f62606d9bd8e/scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", size = 30102038 }, - { url = "https://files.pythonhosted.org/packages/61/d8/84da3fffefb6c7d5a16968fe5b9f24c98606b165bb801bb0b8bc3985200f/scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", size = 22375518 }, - { url = "https://files.pythonhosted.org/packages/44/78/25535a6e63d3b9c4c90147371aedb5d04c72f3aee3a34451f2dc27c0c07f/scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", size = 25142523 }, - { url = "https://files.pythonhosted.org/packages/e0/22/4b4a26fe1cd9ed0bc2b2cb87b17d57e32ab72c346949eaf9288001f8aa8e/scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", size = 35491547 }, - { url = "https://files.pythonhosted.org/packages/32/ea/564bacc26b676c06a00266a3f25fdfe91a9d9a2532ccea7ce6dd394541bc/scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", size = 37634077 }, - { url = "https://files.pythonhosted.org/packages/43/c2/bfd4e60668897a303b0ffb7191e965a5da4056f0d98acfb6ba529678f0fb/scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", size = 37231657 }, - { url = "https://files.pythonhosted.org/packages/4a/75/5f13050bf4f84c931bcab4f4e83c212a36876c3c2244475db34e4b5fe1a6/scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", size = 40035857 }, - { url = "https://files.pythonhosted.org/packages/b9/8b/7ec1832b09dbc88f3db411f8cdd47db04505c4b72c99b11c920a8f0479c3/scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", size = 41217654 }, - { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, - { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, - { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, - { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, - { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, - { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, - { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, - { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, - { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, - { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, - { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, - { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, - { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, - { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, - { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, - { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, - { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, - { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, - { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, - { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, - { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, - { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, - { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, - { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, - { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, - { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, - { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/58/6ca66896635352812de66f71cdf9ff86b3a4f79071ca5730088c0cd0fc8d/ruff-0.14.1.tar.gz", hash = "sha256:1dd86253060c4772867c61791588627320abcb6ed1577a90ef432ee319729b69", size = 5513429, upload-time = "2025-10-16T18:05:41.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/39/9cc5ab181478d7a18adc1c1e051a84ee02bec94eb9bdfd35643d7c74ca31/ruff-0.14.1-py3-none-linux_armv6l.whl", hash = "sha256:083bfc1f30f4a391ae09c6f4f99d83074416b471775b59288956f5bc18e82f8b", size = 12445415, upload-time = "2025-10-16T18:04:48.227Z" }, + { url = "https://files.pythonhosted.org/packages/ef/2e/1226961855ccd697255988f5a2474890ac7c5863b080b15bd038df820818/ruff-0.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f6fa757cd717f791009f7669fefb09121cc5f7d9bd0ef211371fad68c2b8b224", size = 12784267, upload-time = "2025-10-16T18:04:52.515Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ea/fd9e95863124ed159cd0667ec98449ae461de94acda7101f1acb6066da00/ruff-0.14.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6191903d39ac156921398e9c86b7354d15e3c93772e7dbf26c9fcae59ceccd5", size = 11781872, upload-time = "2025-10-16T18:04:55.396Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5a/e890f7338ff537dba4589a5e02c51baa63020acfb7c8cbbaea4831562c96/ruff-0.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed04f0e04f7a4587244e5c9d7df50e6b5bf2705d75059f409a6421c593a35896", size = 12226558, upload-time = "2025-10-16T18:04:58.166Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7a/8ab5c3377f5bf31e167b73651841217542bcc7aa1c19e83030835cc25204/ruff-0.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9e6cf6cd4acae0febbce29497accd3632fe2025c0c583c8b87e8dbdeae5f61", size = 12187898, upload-time = "2025-10-16T18:05:01.455Z" }, + { url = "https://files.pythonhosted.org/packages/48/8d/ba7c33aa55406955fc124e62c8259791c3d42e3075a71710fdff9375134f/ruff-0.14.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fa2458527794ecdfbe45f654e42c61f2503a230545a91af839653a0a93dbc6", size = 12939168, upload-time = "2025-10-16T18:05:04.397Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c2/70783f612b50f66d083380e68cbd1696739d88e9b4f6164230375532c637/ruff-0.14.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:39f1c392244e338b21d42ab29b8a6392a722c5090032eb49bb4d6defcdb34345", size = 14386942, upload-time = "2025-10-16T18:05:07.102Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/cd7abb9c776b66d332119d67f96acf15830d120f5b884598a36d9d3f4d83/ruff-0.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7382fa12a26cce1f95070ce450946bec357727aaa428983036362579eadcc5cf", size = 13990622, upload-time = "2025-10-16T18:05:09.882Z" }, + { url = "https://files.pythonhosted.org/packages/eb/56/4259b696db12ac152fe472764b4f78bbdd9b477afd9bc3a6d53c01300b37/ruff-0.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0bf2be3ae8521e1093a487c4aa3b455882f139787770698530d28ed3fbb37c", size = 13431143, upload-time = "2025-10-16T18:05:13.46Z" }, + { url = "https://files.pythonhosted.org/packages/e0/35/266a80d0eb97bd224b3265b9437bd89dde0dcf4faf299db1212e81824e7e/ruff-0.14.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabcaa9ccf8089fb4fdb78d17cc0e28241520f50f4c2e88cb6261ed083d85151", size = 13132844, upload-time = "2025-10-16T18:05:16.1Z" }, + { url = "https://files.pythonhosted.org/packages/65/6e/d31ce218acc11a8d91ef208e002a31acf315061a85132f94f3df7a252b18/ruff-0.14.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:747d583400f6125ec11a4c14d1c8474bf75d8b419ad22a111a537ec1a952d192", size = 13401241, upload-time = "2025-10-16T18:05:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b5/dbc4221bf0b03774b3b2f0d47f39e848d30664157c15b965a14d890637d2/ruff-0.14.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5a6e74c0efd78515a1d13acbfe6c90f0f5bd822aa56b4a6d43a9ffb2ae6e56cd", size = 12132476, upload-time = "2025-10-16T18:05:22.163Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/ac99194e790ccd092d6a8b5f341f34b6e597d698e3077c032c502d75ea84/ruff-0.14.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0ea6a864d2fb41a4b6d5b456ed164302a0d96f4daac630aeba829abfb059d020", size = 12139749, upload-time = "2025-10-16T18:05:25.162Z" }, + { url = "https://files.pythonhosted.org/packages/47/26/7df917462c3bb5004e6fdfcc505a49e90bcd8a34c54a051953118c00b53a/ruff-0.14.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0826b8764f94229604fa255918d1cc45e583e38c21c203248b0bfc9a0e930be5", size = 12544758, upload-time = "2025-10-16T18:05:28.018Z" }, + { url = "https://files.pythonhosted.org/packages/64/d0/81e7f0648e9764ad9b51dd4be5e5dac3fcfff9602428ccbae288a39c2c22/ruff-0.14.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cbc52160465913a1a3f424c81c62ac8096b6a491468e7d872cb9444a860bc33d", size = 13221811, upload-time = "2025-10-16T18:05:30.707Z" }, + { url = "https://files.pythonhosted.org/packages/c3/07/3c45562c67933cc35f6d5df4ca77dabbcd88fddaca0d6b8371693d29fd56/ruff-0.14.1-py3-none-win32.whl", hash = "sha256:e037ea374aaaff4103240ae79168c0945ae3d5ae8db190603de3b4012bd1def6", size = 12319467, upload-time = "2025-10-16T18:05:33.261Z" }, + { url = "https://files.pythonhosted.org/packages/02/88/0ee4ca507d4aa05f67e292d2e5eb0b3e358fbcfe527554a2eda9ac422d6b/ruff-0.14.1-py3-none-win_amd64.whl", hash = "sha256:59d599cdff9c7f925a017f6f2c256c908b094e55967f93f2821b1439928746a1", size = 13401123, upload-time = "2025-10-16T18:05:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/b8/81/4b6387be7014858d924b843530e1b2a8e531846807516e9bea2ee0936bf7/ruff-0.14.1-py3-none-win_arm64.whl", hash = "sha256:e3b443c4c9f16ae850906b8d0a707b2a4c16f8d2f0a7fe65c475c5886665ce44", size = 12436636, upload-time = "2025-10-16T18:05:38.995Z" }, ] [[package]] name = "semver" version = "3.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730 } +sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730, upload-time = "2025-01-24T13:19:27.617Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912 }, + { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912, upload-time = "2025-01-24T13:19:24.949Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "slims-python-api" -version = "7.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "deprecation" }, - { name = "flask" }, - { name = "requests" }, - { name = "requests-oauthlib" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0b/21/62fb94273fa5708681de873f0b91bf1dfedde59700e2259052403dc66e62/slims_python_api-7.2.0.tar.gz", hash = "sha256:2dc23bbf7d20ddf0d712a622f34fc4341b3df8b099d0ced111b532b1f4694634", size = 21349 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/1f/938934b209e2a09f9c7a31015218449d2e3eb8c0c29d713c858822c1352f/slims_python_api-7.2.0-py2.py3-none-any.whl", hash = "sha256:88e13e24e0612a55964cdc1f11ba56c47e8befc3ea3ab526e4fc19d622bcab2e", size = 17144 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "snowballstemmer" -version = "2.2.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] [[package]] name = "sortedcontainers" version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] [[package]] name = "sortedcontainers-pydantic" -version = "1.0.0" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "pydantic-core" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/39/b8dbaf922f4f0fd1d7d033f12fe22b5c8b14a41eac6caab671e9cb59144b/sortedcontainers_pydantic-1.0.0.tar.gz", hash = "sha256:eb0e4aeb5197d690165f0a7b1a55c490eabe4b21375c3a91726373b2551e25ee", size = 8191 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/39/c951f89cd289d207730d080ce24d973db18227ea09ba966e4fab9d75dab4/sortedcontainers_pydantic-2.0.0.tar.gz", hash = "sha256:0cb3abfbda64dc1fa2365b578ddc3a259c7d75daeae76d2f9087f5ebc1f8f1fe", size = 53829, upload-time = "2025-04-18T06:51:10.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/f4/4d01fd09a88a6d9707b4609568415cb21585e83f42282dd848c9bc0af95c/sortedcontainers_pydantic-1.0.0-py3-none-any.whl", hash = "sha256:07e92e9b85dbf9248e0a5b59e0311a095e6fb27e0dc461b1209ead5a550b60b2", size = 4619 }, + { url = "https://files.pythonhosted.org/packages/94/ef/a3a7cce565dcd624c5fd457709c0356038288eee1268d7efbb11376f6690/sortedcontainers_pydantic-2.0.0-py3-none-any.whl", hash = "sha256:1c38a05f1a8618189bdd8b87f0c3bc8cc1196e6c39f0e30f694b709ba3e2a508", size = 6446, upload-time = "2025-04-18T06:51:09.553Z" }, ] [[package]] name = "soupsieve" -version = "2.6" +version = "2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, ] [[package]] name = "sphinx" -version = "7.2.6" +version = "8.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "alabaster" }, @@ -1303,6 +1650,7 @@ dependencies = [ { name = "packaging" }, { name = "pygments" }, { name = "requests" }, + { name = "roman-numerals-py" }, { name = "snowballstemmer" }, { name = "sphinxcontrib-applehelp" }, { name = "sphinxcontrib-devhelp" }, @@ -1311,9 +1659,9 @@ dependencies = [ { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/8e/6e51da4b26665b4b92b1944ea18b2d9c825e753e19180cc5bdc818d0ed3b/sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5", size = 7015183 } +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", size = 3207959 }, + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, ] [[package]] @@ -1323,9 +1671,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload-time = "2023-07-08T18:40:52.659Z" }, ] [[package]] @@ -1337,9 +1685,9 @@ dependencies = [ { name = "jinja2" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587 } +sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587, upload-time = "2022-07-05T11:57:49.579Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/9f/81fe50b1861bda8c02b4272a166d14455411e04865ddaf3616f25d12cd50/sphinx_jinja-2.0.2-py3-none-any.whl", hash = "sha256:705ebeb9b7a6018ca3f93724315a7c1effa6ba3db44d630e7eaaa15e4ac081a8", size = 4355 }, + { url = "https://files.pythonhosted.org/packages/20/9f/81fe50b1861bda8c02b4272a166d14455411e04865ddaf3616f25d12cd50/sphinx_jinja-2.0.2-py3-none-any.whl", hash = "sha256:705ebeb9b7a6018ca3f93724315a7c1effa6ba3db44d630e7eaaa15e4ac081a8", size = 4355, upload-time = "2022-07-05T11:57:47.861Z" }, ] [[package]] @@ -1352,83 +1700,74 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/3f/559d054f977596c5535edfeeab1f3a278f3bbb81bada2a1cb3cadbf7bb67/sphinx-jsonschema-1.19.1.tar.gz", hash = "sha256:b2385fe1c7acf2e759152aefed0cb17c920645b2a75c9934000c9c528e7d53c1", size = 18599 } +sdist = { url = "https://files.pythonhosted.org/packages/9c/3f/559d054f977596c5535edfeeab1f3a278f3bbb81bada2a1cb3cadbf7bb67/sphinx-jsonschema-1.19.1.tar.gz", hash = "sha256:b2385fe1c7acf2e759152aefed0cb17c920645b2a75c9934000c9c528e7d53c1", size = 18599, upload-time = "2022-05-01T12:42:58.089Z" } [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, -] - -[[package]] -name = "threadpoolctl" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] [[package]] name = "typenames" -version = "1.3.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/50/39/4d9542b06191f7c5ab8cc9793f558fe7cd02efb10adaf13fbbc01a1a6489/typenames-1.3.0.tar.gz", hash = "sha256:205a1954512e28b6558e761c134e74d243003755676fe8cce49250b8fc192798", size = 45717 } +sdist = { url = "https://files.pythonhosted.org/packages/ea/e3/43295dabe364f88d764be3595e942cb129469a99361a1af8fc77039912e2/typenames-2.1.0.tar.gz", hash = "sha256:af231a91e8c377a5497693944d604865164adaf8754d17f521e61b0fbb1f6bf9", size = 160235, upload-time = "2025-09-15T15:41:53.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/04/252cf801488cc05c355c5ddddb8a017be35b1f04b82a8ffcddbe59867218/typenames-1.3.0-py3-none-any.whl", hash = "sha256:666dfd7baebe3675dbdf950f19de08d5b15e5f9e0a71fe91fb8135ea68fe0889", size = 10528 }, + { url = "https://files.pythonhosted.org/packages/5d/77/5a1219258adf0b217e8f3d1df84847073580d9d304e6fba77d03fb4fe733/typenames-2.1.0-py3-none-any.whl", hash = "sha256:34616136b4d6b92ef598fd5a2d2524506ef437489c71d1305e805046c41dd07d", size = 10958, upload-time = "2025-09-15T15:41:51.894Z" }, ] [[package]] name = "typer" -version = "0.15.2" +version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1436,59 +1775,60 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, + { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, ] [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] -name = "typing-inspect" -version = "0.9.0" +name = "typing-inspection" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "urllib3" -version = "2.3.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] [[package]] -name = "werkzeug" -version = "3.1.3" +name = "winkerberos" +version = "0.12.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/75/86d470935167eb1c40d53498993e14cc021d9611a539d61c9b4202c291ab/winkerberos-0.12.2.tar.gz", hash = "sha256:ff91daed04727a0362892802ee093d8da11f08536393526bdf3bc64e04079faa", size = 35672, upload-time = "2025-04-02T14:41:48.274Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 }, + { url = "https://files.pythonhosted.org/packages/91/12/23b29d359dee9f7a8243cb0040ea1834acd1af8cbc38cfe1c7ca82ab4ec0/winkerberos-0.12.2-cp311-cp311-win32.whl", hash = "sha256:ff2b2ec9b9246bbc05f0d4e6fe5f3f3563237357b9b35eaa58ec1a9ddf349ab8", size = 25332, upload-time = "2025-04-02T14:41:38.671Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/2bfa1dcdb4a47b7f989a9e758c892bd7393a156b0e1f0df63eca8304e892/winkerberos-0.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:e6ac2b2cc329a68502821905f6ffe48e109d54a46aba7414ea231a30c75bb2d9", size = 27671, upload-time = "2025-04-02T14:41:40.104Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/26c5b1435654596c07b314653183ffe42b64ea07041c328f0fd4c68fe9f9/winkerberos-0.12.2-cp312-cp312-win32.whl", hash = "sha256:46dac1300e20738cbaf6c17c2e4832062ed7faee346c7a96f0e57f8bbe279c25", size = 25396, upload-time = "2025-04-02T14:41:41.6Z" }, + { url = "https://files.pythonhosted.org/packages/64/b1/6c4a1e4e50553798eb44dbb0d71ba6af48e2a62a0eb01bd0d4e2b41914e3/winkerberos-0.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:2c5c7a70c0d4a43546b20d5654e7e7e5e5e96f42084a7f293864f7ad0fb1e953", size = 27710, upload-time = "2025-04-02T14:41:42.656Z" }, + { url = "https://files.pythonhosted.org/packages/5f/91/cff6750c7c3b2a9f35e12cd7c4df901251fc3be985edef707a3458c43e9a/winkerberos-0.12.2-cp313-cp313-win32.whl", hash = "sha256:482a72500b7822cc8f941d0c6eed668a24c030ac145c97732e175b51441bebbf", size = 25391, upload-time = "2025-04-02T14:41:43.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/98/defb037ad127c4006c4e992dd55ce0df92059626d3df5f5f4c5fc8502c26/winkerberos-0.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:efd65ba54534512070916cb9c91ef9798a0f9fb0b04e12732c9631e71553fd69", size = 27704, upload-time = "2025-04-02T14:41:45.203Z" }, ] From a9c8fefee23995a6ec39cd6379c930cf70c0f7f1 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:10:32 -0700 Subject: [PATCH 03/32] Update bonsai dependencies and workflow --- .gitignore | 1 + LICENSE | 2 +- bonsai/Bonsai.config | 152 +++++----- bonsai/setup.ps1 | 21 +- src/Extensions/TriggeredCamerasLogger.bonsai | 8 +- src/main.bonsai | 283 ++++++++++--------- 6 files changed, 257 insertions(+), 210 deletions(-) diff --git a/.gitignore b/.gitignore index a2ce5ef..c490561 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ Bonsai.exe.WebView2 local .venv *.sln +Bonsai/Settings/ # Byte-compiled / optimized / DLL files diff --git a/LICENSE b/LICENSE index 41f6723..df0d99b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Allen Institute for Neural Dynamics +Copyright (c) 2025 Allen Institute for Neural Dynamics Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index ecabce8..42020c3 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -4,30 +4,30 @@ - - - + + + - + - + - - - - - - - + + + + + + + - + - + @@ -35,27 +35,32 @@ - + - + - - - - + + + + + + - + + + + - + - + @@ -65,15 +70,15 @@ - - + + - - + + - - + + @@ -120,63 +125,65 @@ - - - - + + + - + - + - - - - - - - + + + + + + + - + - + - + - + - - - - + + + + - + + + + - + - - - + + + @@ -184,19 +191,21 @@ - - + + - - + + - - + + + + @@ -204,15 +213,24 @@ + + + + + + + + + - - - - - - + + + + + + diff --git a/bonsai/setup.ps1 b/bonsai/setup.ps1 index 7f43d41..890eeda 100644 --- a/bonsai/setup.ps1 +++ b/bonsai/setup.ps1 @@ -1,9 +1,20 @@ +Push-Location $PSScriptRoot if (!(Test-Path "./Bonsai.exe")) { - Invoke-WebRequest "https://github.com/bonsai-rx/bonsai/releases/download/2.8.5/Bonsai.zip" -OutFile "temp.zip" - Move-Item -Path "NuGet.config" "temp.config" + $release = "https://github.com/bonsai-rx/bonsai/releases/latest/download/Bonsai.zip" + $configPath = "./Bonsai.config" + if (Test-Path $configPath) { + [xml]$config = Get-Content $configPath + $bootstrapper = $config.PackageConfiguration.Packages.Package.where{$_.id -eq 'Bonsai'} + if ($bootstrapper) { + $version = $bootstrapper.version + $release = "https://github.com/bonsai-rx/bonsai/releases/download/$version/Bonsai.zip" + } + } + Invoke-WebRequest $release -OutFile "temp.zip" + Move-Item -Path "NuGet.config" "temp.config" -ErrorAction SilentlyContinue Expand-Archive "temp.zip" -DestinationPath "." -Force - Move-Item -Path "temp.config" "NuGet.config" -Force + Move-Item -Path "temp.config" "NuGet.config" -Force -ErrorAction SilentlyContinue Remove-Item -Path "temp.zip" - Remove-Item -Path "Bonsai32.exe" } -& .\Bonsai.exe --no-editor \ No newline at end of file +& .\Bonsai.exe --no-editor +Pop-Location \ No newline at end of file diff --git a/src/Extensions/TriggeredCamerasLogger.bonsai b/src/Extensions/TriggeredCamerasLogger.bonsai index dc1fcca..f924fbb 100644 --- a/src/Extensions/TriggeredCamerasLogger.bonsai +++ b/src/Extensions/TriggeredCamerasLogger.bonsai @@ -1,5 +1,5 @@  - - TaskLogicParameters - - - SaveRawVideo + SaveRawVideo - diff --git a/src/main.bonsai b/src/main.bonsai index 6b1f6f3..d82c534 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -1,18 +1,16 @@  - @@ -48,8 +46,8 @@ RawRigSchema - - + + @@ -59,26 +57,6 @@ RigSchema - - RawTaskLogicSchema - - - - - - - 1 - - - - TaskLogicSchema - - - TaskParameters - - - TaskLogicParameters - @@ -87,11 +65,6 @@ - - - - - @@ -100,8 +73,8 @@ - - ../. + + ../. @@ -129,7 +102,7 @@ CompoundRootPath - + SoftwareEvent @@ -150,7 +123,68 @@ HarpDevices - + + HarpBehavior + + + + RigSchema + + + HarpBehavior.PortName + + + + + + + + COM5 + TriggerHarpReadDump + + + HarpBehaviorEvents + + + + + + Seconds + + + HarpTimestampSource + + + HarpBehaviorEvents + + + + 1 + + + + Write + + PortDI PortDIO AnalogData Camera0 Camera1 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + + StartExperiment @@ -378,6 +412,19 @@ + + + false + + + + + 1 + + + + SaveRawVideo + QualityControl @@ -430,8 +477,8 @@ Repository - - false + + false @@ -462,8 +509,8 @@ - - Repository is not clean! Please discard all local changes. + + Repository is not clean! Please discard all local changes. @@ -503,7 +550,7 @@ - + @@ -550,7 +597,7 @@ - + Modality Behavior @@ -582,11 +629,11 @@ - + LoggingRootPath Behavior - Behavior - Behavior + + @@ -622,9 +669,9 @@ - - - + + + @@ -635,11 +682,11 @@ - + LoggingRootPath Behavior - HarpCommands/Behavior - Behavior + + @@ -681,7 +728,7 @@ - + Modality @@ -708,8 +755,8 @@ Head - - RepositoryStatus + + RepositoryStatus @@ -719,13 +766,13 @@ Repository - - false + + false - - IsRepositoryClean + + IsRepositoryClean @@ -782,7 +829,9 @@ SubjectSchema - + + None + Modality @@ -806,39 +855,13 @@ Config session_output - - TaskLogicSchema - - - - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - Config - tasklogic_output - RigSchema - + + None + Modality @@ -941,30 +964,24 @@ - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -981,8 +998,8 @@ - - SoftwareEvent + + SoftwareEvent @@ -995,10 +1012,12 @@ - + - + + None + Modality @@ -1062,7 +1081,7 @@ - + Modality BehaviorVideos @@ -1431,21 +1450,23 @@ - - - - - - - - - - - + + + + + + + + + + + - - + + + + \ No newline at end of file From 5a0fcfd109258b06858e5975cd6425c52f809292 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:14:22 -0700 Subject: [PATCH 04/32] Fix examples --- examples/examples.py | 31 +++++++------------ src/test_deserialization.bonsai | 53 +++++++-------------------------- tests/test_bonsai.py | 15 ++-------- 3 files changed, 25 insertions(+), 74 deletions(-) diff --git a/examples/examples.py b/examples/examples.py index f083223..bedd038 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -2,13 +2,10 @@ import os import aind_behavior_services.rig as rig -from aind_behavior_just_frames.task_logic import ( - AindVideoEncodingBenchmarksTaskLogic, - AindVideoEncodingBenchmarksTaskParameters, -) + from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_just_frames.rig import AindVideoEncodingBenchmarksRig +from aind_behavior_just_frames.rig import AindJustFramesRig def main(path_seed: str = "./local/{schema}.json"): @@ -24,48 +21,42 @@ def main(path_seed: str = "./local/{schema}.json"): experimenter=["Foo", "Bar"], ) - this_task = AindVideoEncodingBenchmarksTaskLogic( - task_parameters=AindVideoEncodingBenchmarksTaskParameters( - save_raw_video=False, - ) - ) - - video_writer = rig.VideoWriterFfmpeg( + video_writer = rig.cameras.VideoWriterFfmpeg( frame_rate=120, container_extension="mp4", # input and output arguments can be overridden by the user ) - this_rig = AindVideoEncodingBenchmarksRig( + this_rig = AindJustFramesRig( rig_name="this_rig", - triggered_camera_controller_0=rig.CameraController[rig.SpinnakerCamera]( + triggered_camera_controller_0=rig.cameras.CameraController[rig.cameras.SpinnakerCamera]( frame_rate=120, cameras={ - "FaceCamera": rig.SpinnakerCamera( + "FaceCamera": rig.cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer, - adc_bit_depth=rig.SpinnakerCameraAdcBitDepth.ADC10BIT, + adc_bit_depth=rig.cameras.SpinnakerCameraAdcBitDepth.ADC10BIT, ), - "SideCamera": rig.SpinnakerCamera( + "SideCamera": rig.cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer, - adc_bit_depth=rig.SpinnakerCameraAdcBitDepth.ADC10BIT, + adc_bit_depth=rig.cameras.SpinnakerCameraAdcBitDepth.ADC10BIT, ), }, ), triggered_camera_controller_1=None, - harp_behavior=rig.HarpBehavior(port_name="COM3"), + harp_behavior=rig.harp.HarpBehavior(port_name="COM3"), ) os.makedirs(os.path.dirname(path_seed), exist_ok=True) - models = [this_session, this_rig, this_task] + models = [this_session, this_rig] for model in models: with open(path_seed.format(schema=model.__class__.__name__), "w", encoding="utf-8") as f: diff --git a/src/test_deserialization.bonsai b/src/test_deserialization.bonsai index ea0d5c9..73caef8 100644 --- a/src/test_deserialization.bonsai +++ b/src/test_deserialization.bonsai @@ -1,10 +1,8 @@  - @@ -40,8 +38,8 @@ RawRigSchema - - + + @@ -51,26 +49,6 @@ RigSchema - - RawTaskLogicSchema - - - - - - - 1 - - - - TaskLogicSchema - - - TaskParameters - - - TaskLogicParameters - @@ -79,11 +57,6 @@ - - - - - @@ -91,19 +64,17 @@ SubjectSchema - - - - TaskLogicSchema - - - + + None + RigSchema - + + None + @@ -115,12 +86,10 @@ - + - + - - \ No newline at end of file diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index a060d4b..d36ff41 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -4,14 +4,11 @@ from pathlib import Path from typing import Generic, List, Optional, TypeVar, Union -from aind_behavior_just_frames.task_logic import ( - AindVideoEncodingBenchmarksTaskLogic, -) from aind_behavior_services.session import AindBehaviorSessionModel from aind_behavior_services.utils import run_bonsai_process from pydantic import ValidationError -from aind_behavior_just_frames.rig import AindVideoEncodingBenchmarksRig +from aind_behavior_just_frames.rig import AindBehaviorRigModel sys.path.append(".") from examples import examples # isort:skip # pylint: disable=wrong-import-position @@ -20,8 +17,7 @@ TModel = TypeVar( "TModel", bound=Union[ - AindVideoEncodingBenchmarksRig, - AindVideoEncodingBenchmarksTaskLogic, + AindBehaviorRigModel, AindBehaviorSessionModel, ], ) @@ -40,12 +36,7 @@ def test_deserialization(self): TestModel( bonsai_property="RigPath", json_root=JSON_ROOT, - model=AindVideoEncodingBenchmarksRig, - ), - TestModel( - bonsai_property="TaskLogicPath", - json_root=JSON_ROOT, - model=AindVideoEncodingBenchmarksTaskLogic, + model=AindBehaviorRigModel, ), ] From 1827787cb18f7bf63c39fa533efb05cdb55bb2fb Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:15:21 -0700 Subject: [PATCH 05/32] Fix tests --- tests/test_bonsai.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index d36ff41..9666a9a 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -8,7 +8,7 @@ from aind_behavior_services.utils import run_bonsai_process from pydantic import ValidationError -from aind_behavior_just_frames.rig import AindBehaviorRigModel +from aind_behavior_just_frames.rig import AindJustFramesRig sys.path.append(".") from examples import examples # isort:skip # pylint: disable=wrong-import-position @@ -17,7 +17,7 @@ TModel = TypeVar( "TModel", bound=Union[ - AindBehaviorRigModel, + AindJustFramesRig, AindBehaviorSessionModel, ], ) @@ -36,7 +36,7 @@ def test_deserialization(self): TestModel( bonsai_property="RigPath", json_root=JSON_ROOT, - model=AindBehaviorRigModel, + model=AindJustFramesRig, ), ] From 9aa229512bf896a5fa5b77faef330fffa620692e Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:20:02 -0700 Subject: [PATCH 06/32] Refactor CICD and docs --- .github/workflows/ci.yml | 24 -- .github/workflows/docs.yml | 24 -- .github/workflows/just-frames-cicd.yml | 325 +++++++++++++++++++++++++ .github/workflows/tag_and_publish.yml | 10 - docs/conf.py | 14 +- docs/json-schemas.rig.rst | 9 - docs/json-schemas.rst | 15 +- docs/json-schemas.session.rst | 9 - docs/json-schemas.task_logic.rst | 9 - scripts/deploy.ps1 | 28 ++- 10 files changed, 358 insertions(+), 109 deletions(-) delete mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/just-frames-cicd.yml delete mode 100644 .github/workflows/tag_and_publish.yml delete mode 100644 docs/json-schemas.rig.rst delete mode 100644 docs/json-schemas.session.rst delete mode 100644 docs/json-schemas.task_logic.rst diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 5cf85bb..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: ci/cd - -on: - workflow_dispatch: - pull_request: - branches: - - main - push: - branches: - - main - -jobs: - - python-linting: - uses: AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/python-linting.yml@main - with: - runs-on: ubuntu-latest - - aind-behavior-framework-testing: - uses: AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/test-aind-behavior-framework.yml@main - with: - python-version-path: .python-version - run-coverage: false - run-schema: true \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 2439d16..0000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Deploy Sphinx documentation to Pages - -on: - workflow_dispatch: - push: - branches: [main] # branch to trigger deployment - -jobs: - pages: - runs-on: ubuntu-20.04 - steps: - - name: Setup Graphviz - uses: ts-graphviz/setup-graphviz@v2.0.2 - - id: deployment - uses: sphinx-notes/pages@v3 - with: - publish: false - python_version: 3.11 - checkout: true - - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ${{ steps.deployment.outputs.artifact }} - force_orphan: true \ No newline at end of file diff --git a/.github/workflows/just-frames-cicd.yml b/.github/workflows/just-frames-cicd.yml new file mode 100644 index 0000000..2597e20 --- /dev/null +++ b/.github/workflows/just-frames-cicd.yml @@ -0,0 +1,325 @@ +name: JustFrames test suite + +on: + workflow_dispatch: + inputs: + bump_type: + description: "Version bump type" + required: false + default: "rc" + type: choice + options: + - rc + - patch + - minor + - major + - stable + pull_request: + push: + branches: + - main + - dev* + - release* + release: + types: [published] + +jobs: + # ╔──────────────────────────╗ + # │ _____ _ │ + # │ |_ _|__ ___| |_ ___ │ + # │ | |/ _ \/ __| __/ __| │ + # │ | | __/\__ \ |_\__ \ │ + # │ |_|\___||___/\__|___/ │ + # │ │ + # ╚──────────────────────────╝ + tests: + runs-on: windows-latest + name: JustFrames unit tests + steps: + - uses: actions/checkout@v5 + + - uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Install python dependencies + run: uv sync + + - name: Run ruff format + run: uv run ruff format + + - name: Run ruff check + run: uv run ruff check + + - name: Run codespell + run: uv run codespell + + - name: Setup .NET Core SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Restore dotnet tools + run: dotnet tool restore + + - name: Setup Bonsai environment + working-directory: ./bonsai + run: ./setup.ps1 + + - name: Run python unit tests + run: uv run python -m unittest + + - name: Regenerate schemas + run: uv run just-frames regenerate + + - name: Check for uncommitted changes + run: | + git config --global core.safecrlf false + git diff --exit-code || (echo "Untracked changes found" && exit 1) + + # ╔───────────────────────────────────────────────────────────╗ + # │ ____ ___ ____ ____ ____ _ │ + # │ / ___|_ _/ ___| _ \ | _ \ ___| | ___ __ _ ___ ___ │ + # │ | | | | | | | | | | |_) / _ \ |/ _ \/ _` / __|/ _ \ │ + # │ | |___ | | |___| |_| | | _ < __/ | __/ (_| \__ \ __/ │ + # │ \____|___\____|____/ |_| \_\___|_|\___|\__,_|___/\___| │ + # │ │ + # ╚───────────────────────────────────────────────────────────╝ + github-rc-release: + needs: tests + runs-on: windows-latest + if: > + github.ref == 'refs/heads/main' && + github.event_name == 'push' && + github.event.head_commit.author.email != 'github-actions[bot]@users.noreply.github.com' + name: Create GitHub pre-release + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: main + + - uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Bump pre-release by default + # Note: Bumping the rc will fail if the version is not currently an rc + # To solve it, we bump the patch and rc atomically + shell: bash # interop with win/linux for if statement + run: | + if uv version --bump rc --dry-run; then + uv version --bump rc + else + uv version --bump rc --bump patch + fi + + - name: Regenerate schemas + run: uv run just-frames regenerate + + - name: Commit version and schema changes + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "Bump version and regenerate schemas [skip ci]" || echo "No changes to commit" + git push origin main + + - name: Get version + id: get_version + shell: bash + run: | + version=$(uv version --short) + echo "version=$version" >> $GITHUB_OUTPUT + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.get_version.outputs.version }} + name: v${{ steps.get_version.outputs.version }} + generate_release_notes: true + prerelease: true + body: | + Automated pre-release v${{ steps.get_version.outputs.version }} + + # ╔─────────────────────────────────────────────────────────────────╗ + # │ ____ _ _ _ ____ _ │ + # │ | _ \ _ _| |__ | (_) ___ | _ \ ___| | ___ __ _ ___ ___ │ + # │ | |_) | | | | '_ \| | |/ __| | |_) / _ \ |/ _ \/ _` / __|/ _ \ │ + # │ | __/| |_| | |_) | | | (__ | _ < __/ | __/ (_| \__ \ __/ │ + # │ |_| \__,_|_.__/|_|_|\___| |_| \_\___|_|\___|\__,_|___/\___| │ + # │ │ + # ╚─────────────────────────────────────────────────────────────────╝ + + prepare-public-release: + runs-on: windows-latest + name: Prepare files for public release + needs: tests + if: false + # if: github.event_name == 'workflow_dispatch' + outputs: + version: ${{ steps.get_version.outputs.version }} + is_prerelease: ${{ steps.check_prerelease.outputs.prerelease }} + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: main + + - uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Get target version + id: get_version + shell: bash + run: | + # Use bump type from input (defaults to rc) + bump_type="${{ github.event.inputs.bump_type || 'rc' }}" + echo "Bumping version with type: $bump_type" + + # Handle version bumping based on type + if [[ "$bump_type" == "rc" ]]; then + # Handle rc bumping logic (same as in github-rc-release) + if uv version --bump rc --dry-run; then + uv version --bump rc + else + uv version --bump rc --bump patch + fi + else + # Handle patch, minor, major, stable + uv version --bump $bump_type + fi + + release_version=$(uv run uv version --short) + echo "version=$release_version" >> $GITHUB_OUTPUT + echo "Release version will be: $release_version" + + - name: Validate version format + run: uv version ${{ steps.get_version.outputs.version }} --dry-run + + - name: Update package version + run: uv version ${{ steps.get_version.outputs.version }} + + - name: Regenerate schemas + run: uv run just-frames regenerate + + - name: Commit version, schema changes and create tag + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "Release v${{ steps.get_version.outputs.version }} [skip ci]" + git tag -a "v${{ steps.get_version.outputs.version }}" -m "v${{ steps.get_version.outputs.version }}" + git push origin main + git push origin "v${{ steps.get_version.outputs.version }}" + + - name: Determine if prerelease + id: check_prerelease + shell: bash + run: | + version="${{ steps.get_version.outputs.version }}" + if [[ "$version" == *"rc"* ]]; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.get_version.outputs.version }} + name: Release v${{ steps.get_version.outputs.version }} + generate_release_notes: true + prerelease: ${{ steps.check_prerelease.outputs.prerelease }} + body: | + Release v${{ steps.get_version.outputs.version }} + + This release was manually triggered. + + publish-to-pypi: + runs-on: windows-latest + name: Publish to PyPI + needs: [tests, prepare-public-release] + if: | + (github.event_name == 'workflow_dispatch') || + (github.event_name == 'release' && + github.event.action == 'published' && + !github.event.release.prerelease && + startsWith(github.ref, 'refs/tags/v')) + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: ${{ github.event_name == 'workflow_dispatch' && 'main' || github.ref_name }} + + - uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Verify version consistency (for automatic releases) + if: github.event_name == 'release' + shell: bash + run: | + tag_version=$(echo "${{ github.ref_name }}" | sed 's/^v//') + package_version=$(uv run uv version --short) + if [[ "$tag_version" != "$package_version" ]]; then + echo "ERROR: Tag version ($tag_version) doesn't match package version ($package_version)" + exit 1 + fi + echo "✅ Version consistency verified: $tag_version" + + - name: Get current version (for manual releases) + if: github.event_name == 'workflow_dispatch' + shell: bash + run: | + package_version=$(uv run uv version --short) + echo "📦 Publishing version: $package_version" + + - name: Build + run: uv build + + - name: Publish to PyPI + run: uv publish --token ${{ secrets.AIND_PYPI_TOKEN }} + + # ╔─────────────────────────╗ + # │ ____ │ + # │ | _ \ ___ ___ ___ │ + # │ | | | |/ _ \ / __/ __| │ + # │ | |_| | (_) | (__\__ \ │ + # │ |____/ \___/ \___|___/ │ + # │ │ + # ╚─────────────────────────╝ + build-docs: + name: Build and deploy documentation to GitHub Pages + runs-on: ubuntu-latest + needs: github-rc-release + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@v2 + + - name: Install docs group of dependencies + run: uv sync --group docs + + - name: Build Sphinx documentation + run: uv run sphinx-build -b html docs/ _build/html + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: _build/html + force_orphan: true diff --git a/.github/workflows/tag_and_publish.yml b/.github/workflows/tag_and_publish.yml deleted file mode 100644 index 1f566ac..0000000 --- a/.github/workflows/tag_and_publish.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: Tag and Publish - -on: - workflow_dispatch: {} - -jobs: - tag-and-publish: - uses : AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/python-package-tag-and-publish.yml@main - with: - publish: false \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index bfc27f7..89e17cc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,13 +15,13 @@ sys.path.insert(0, os.path.abspath("../src/DataSchemas")) import aind_behavior_just_frames -SOURCE_ROOT = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VideoEncodingBenchmarks/tree/main/src/DataSchemas/" +SOURCE_ROOT = "https://github.com/AllenNeuralDynamics/Aind.Behavior.JustFrames/tree/main/src/DataSchemas/" # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = "AIND Video Encoding Benchmarks project" -copyright = "2024, Allen Institute for Neural Dynamics" +copyright = "2025, Allen Institute for Neural Dynamics" author = "Bruno Cruz" release = aind_behavior_just_frames.__semver__ @@ -79,13 +79,3 @@ def linkcode_resolve(domain, info): filename = info["module"].replace(".", "/") return f"{SOURCE_ROOT}/{filename}.py" - -# -- Class diagram generation - - -def export_model_diagram(model: BaseModel, root: str = "_static") -> None: - diagram = erd.create(model) - diagram.draw(f"{root}/{model.__name__}.svg") - - -_diagram_root = "_static" diff --git a/docs/json-schemas.rig.rst b/docs/json-schemas.rig.rst deleted file mode 100644 index 1c30d42..0000000 --- a/docs/json-schemas.rig.rst +++ /dev/null @@ -1,9 +0,0 @@ -json-schemas.rig ------------------- - -`Download Schema `_ - -.. jsonschema:: https://raw.githubusercontent.com/AllenNeuralDynamics/Aind.Behavior.VideoEncodingBenchmarks/main/src/DataSchemas/aind_video_encoding_benchmarks_rig.json - :lift_definitions: - :auto_reference: - diff --git a/docs/json-schemas.rst b/docs/json-schemas.rst index 1fdf2c9..836672e 100644 --- a/docs/json-schemas.rst +++ b/docs/json-schemas.rst @@ -1,8 +1,11 @@ -json-schemas +json-schema ------------- -.. toctree:: - :maxdepth: 4 +The following json-schemas are used as the format definition of the input for this task. They are the result of the `Pydantic`` models defined in `src/aind_behavior_just_frames`, and are also used to generate `src/Extensions/AindBehaviorVrForaging.cs` via `Bonsai.Sgen`. - json-schemas.session - json-schemas.rig - json-schemas.task_logic \ No newline at end of file +`Download Schema `_ + +Rig Schema +~~~~~~~~~~~~~~ +.. jsonschema:: https://raw.githubusercontent.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/main/src/DataSchemas/aind_behavior_just_frames.json#/$defs/AindJustFramesRig + :lift_definitions: + :auto_reference: diff --git a/docs/json-schemas.session.rst b/docs/json-schemas.session.rst deleted file mode 100644 index 9929f86..0000000 --- a/docs/json-schemas.session.rst +++ /dev/null @@ -1,9 +0,0 @@ -json-schemas.session ---------------------- - -`Download Schema `_ - -.. jsonschema:: https://raw.githubusercontent.com/AllenNeuralDynamics/Aind.Behavior.VideoEncodingBenchmarks/main/src/DataSchemas/aind_behavior_session_model.json - :lift_definitions: - :auto_reference: - diff --git a/docs/json-schemas.task_logic.rst b/docs/json-schemas.task_logic.rst deleted file mode 100644 index 5f03a9d..0000000 --- a/docs/json-schemas.task_logic.rst +++ /dev/null @@ -1,9 +0,0 @@ -json-schemas.task_logic -------------------------- - -`Download Schema `_ - -.. jsonschema:: https://raw.githubusercontent.com/AllenNeuralDynamics/Aind.Behavior.VideoEncodingBenchmarks/main/src/DataSchemas/aind_video_encoding_benchmarks_task_logic.json - :lift_definitions: - :auto_reference: - diff --git a/scripts/deploy.ps1 b/scripts/deploy.ps1 index 5de218e..9c937f1 100644 --- a/scripts/deploy.ps1 +++ b/scripts/deploy.ps1 @@ -1,15 +1,31 @@ $scriptPath = $MyInvocation.MyCommand.Path $scriptDirectory = Split-Path -Parent $scriptPath Set-Location (Split-Path -Parent $scriptDirectory) -Write-Output "Creating a Python environment..." + +Write-Output "Initializing and updating submodules..." +&git submodule update --init --recursive + +Write-Output "Creating a Python environment..." + +if (-not (Get-Command uv -ErrorAction SilentlyContinue)) { + throw "The 'uv' command was not found. See https://docs.astral.sh/uv/getting-started/installation/ for instructions." +} + if (Test-Path -Path ./.venv) { Remove-Item ./.venv -Recurse -Force } -&python -m venv ./.venv +&uv venv .\.venv\Scripts\Activate.ps1 -Write-Output "Installing python packages..." -&pip install .[launcher] +Write-Output "Synchronizing environment..." +&uv sync --extra launcher Write-Output "Creating a Bonsai environment and installing packages..." -Set-Location "bonsai" -.\setup.ps1 +if (Test-Path -Path "bonsai") { + Set-Location "bonsai" + .\setup.ps1 +} elseif (Test-Path -Path ".bonsai") { + Set-Location ".bonsai" + .\setup.ps1 +} else { + throw "Neither 'bonsai' nor '.bonsai' directory found." +} Set-Location .. \ No newline at end of file From 387e1058689765180c5f3d0b690301721f87d9e6 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:20:20 -0700 Subject: [PATCH 07/32] Linting --- docs/conf.py | 3 --- examples/examples.py | 1 - 2 files changed, 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 89e17cc..dd6481c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -7,8 +7,6 @@ import sys import aind_behavior_just_frames.task_logic -import erdantic as erd -from pydantic import BaseModel import aind_behavior_just_frames.rig @@ -78,4 +76,3 @@ def linkcode_resolve(domain, info): return None filename = info["module"].replace(".", "/") return f"{SOURCE_ROOT}/{filename}.py" - diff --git a/examples/examples.py b/examples/examples.py index bedd038..9d10ef8 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -2,7 +2,6 @@ import os import aind_behavior_services.rig as rig - from aind_behavior_services.session import AindBehaviorSessionModel from aind_behavior_just_frames.rig import AindJustFramesRig From 42e26ee903c76921a4427396199d2abd7dd08d21 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:25:45 -0700 Subject: [PATCH 08/32] Add instructions --- README.md | 12 ++++----- examples/clabe.yml | 10 +++++++ src/aind_behavior_just_frames/launcher.py | 32 ++++++++++++++++++++++- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 examples/clabe.yml diff --git a/README.md b/README.md index cd35173..7f0f8df 100644 --- a/README.md +++ b/README.md @@ -7,22 +7,22 @@ A repository with code for benchmarking online video acquisition/encoding pipeli The easiest way to get started is to clone this repository and run the `deploy.cmd` script. This script will install the necessary dependencies. If you use any python-dependent scripts (e.g. create settings json instances, `regenerate` or `clabe` commands), make sure to run them from an activated environment (`./.venv` directory in the root of the repo). -To run the benchmark workflow you will need a valid set of schemas. Examples of how to generate these can be found in the `./examples/examples.py` file. For the most part, you will only need to generate the rig schema, as the others can be automatically generated using the `clabe` script. In summary: +To run the workflow you will need a valid set of schemas. Examples of how to generate these can be found in the `./examples/examples.py` file. For the most part, you will only need to generate the rig schema, as the others can be automatically generated using the `clabe` script. In summary: -1. Generate the rig and task logic schemas by adapting the script in `./examples/examples.py`. You should make a copy of the example and modify it outside the repository directory, otherwise, any untracked changes / new files in the local repository will flag it as "dirty" and the benchmarks will not be allowed to run. +1. Generate the rig configuration by adapting the script in `./examples/examples.py`. You should make a copy of the example and modify it outside the repository directory, otherwise, any untracked changes / new files in the local repository will flag it as "dirty" and the benchmarks will not be allowed to run. 2. Once the schema is defined in the `.py` file, run the script to generate a valid `.json` file that will be the input to the benchmark workflow. -3. Copy and Paste the generated rig schema (i.e. the `.json` file) to the target config folder (by default `\\allen\aind\scratch\AindBehavior.db\AindVideoEncodingBenchmarks\Rig\\.json`) and the task logic schema to `(...)\AindVideoEncodingBenchmarks\TaskLogic\.json` -4. Run the `clabe`, from the root of the repository, and follow the prompt. +3. Copy and Paste the generated rig schema (i.e. the `.json` file) to the target config folder (by default `\\allen\aind\scratch\AindBehavior.db\AindBehaviorJustFrames\Rig\\.json`)/ +4. Run the `uv run just-frames clabe`, from the root of the repository, and follow the prompt. 5. Once Bonsai is running, double-click the `UserInterface` operator to open the GUI 6. Click Start (Stop) to start (stop) the benchmark workflow. Alternatively, you can run the `main.bonsai` script directly using the following command from the root of the repository: ```cmd -"./bonsai/bonsai.exe" "./src/main.bonsai" -p TaskLogicPath="" -p RigPath="" -p SessionPath="" +"./bonsai/bonsai.exe" "./src/main.bonsai" -p RigPath="" -p SessionPath="" ``` -where ``, ``, and `` are the paths to the task logic, rig, and session schemas, respectively. +where `` and `` are the paths to the rig and session schemas, respectively. diff --git a/examples/clabe.yml b/examples/clabe.yml new file mode 100644 index 0000000..ba39807 --- /dev/null +++ b/examples/clabe.yml @@ -0,0 +1,10 @@ +# In order to get picked up, move this file to the root of the project or ./local + +data_dir: C:/Data +allow_dirty: true + +default_behavior_picker: + config_library_dir: '\\allen\aind\scratch\AindBehavior.db\AindBehaviorJustFrames' + +robocopy: + destination: '\\allen\aind\scratch\data' \ No newline at end of file diff --git a/src/aind_behavior_just_frames/launcher.py b/src/aind_behavior_just_frames/launcher.py index 40a3449..3ede67d 100644 --- a/src/aind_behavior_just_frames/launcher.py +++ b/src/aind_behavior_just_frames/launcher.py @@ -1,12 +1,42 @@ import logging - +from pathlib import Path + +from aind_behavior_services.session import AindBehaviorSessionModel +from clabe import resource_monitor +from clabe.apps import ( + AindBehaviorServicesBonsaiApp, + BonsaiAppSettings, +) +from clabe.data_transfer import robocopy from clabe.launcher import Launcher, LauncherCliArgs +from clabe.pickers import DefaultBehaviorPicker, DefaultBehaviorPickerSettings from pydantic_settings import CliApp +from aind_behavior_just_frames.rig import AindJustFramesRig + logger = logging.getLogger(__name__) def experiment(launcher: Launcher) -> None: + monitor = resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(launcher.settings.data_dir, 2e11), + ] + ) + + # Validate resources + monitor.run() + + picker = DefaultBehaviorPicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + session = picker.pick_session(AindBehaviorSessionModel) + launcher.register_session(session) + rig = picker.pick_rig(AindJustFramesRig) + bonsai_app = AindBehaviorServicesBonsaiApp(BonsaiAppSettings(workflow=Path(r"./src/main.bonsai"))) + bonsai_app.add_app_settings(launcher, rig=rig, session=session) + bonsai_app.get_result(allow_stderr=True) + + launcher.copy_logs() + robocopy.RobocopyService(source=launcher.session_directory, settings=robocopy.RobocopySettings()) return From dbfe7cb0b206872bd9ec5fcdcbc482e9c6cf992b Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:28:40 -0700 Subject: [PATCH 09/32] Refactor readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7f0f8df..11ff035 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Aind.Behavior.VideoEncodingBenchmarks +# Aind.Behavior.JustFrames -A repository with code for benchmarking online video acquisition/encoding pipelines +A repository with code for a online video acquisition/encoding pipeline ## Getting started From 63f7c7b1d1aab6ac884db7431202c8d1a87002fd Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:43:36 -0700 Subject: [PATCH 10/32] Log WhiteRabbit --- src/Extensions/HarpBehavior.bonsai | 7 +- src/Extensions/HarpBehaviorGetMetadata.bonsai | 540 ++++++++++++++++++ src/main.bonsai | 279 +++++---- 3 files changed, 724 insertions(+), 102 deletions(-) create mode 100644 src/Extensions/HarpBehaviorGetMetadata.bonsai diff --git a/src/Extensions/HarpBehavior.bonsai b/src/Extensions/HarpBehavior.bonsai index 31da56a..a3c3a2e 100644 --- a/src/Extensions/HarpBehavior.bonsai +++ b/src/Extensions/HarpBehavior.bonsai @@ -1,5 +1,5 @@  -COM5 TriggerHarpReadDump + + HarpBehaviorEvents + @@ -31,7 +34,6 @@ HarpTimestampSource - HarpBehaviorEvents @@ -54,7 +56,6 @@ - diff --git a/src/Extensions/HarpBehaviorGetMetadata.bonsai b/src/Extensions/HarpBehaviorGetMetadata.bonsai new file mode 100644 index 0000000..108ca1f --- /dev/null +++ b/src/Extensions/HarpBehaviorGetMetadata.bonsai @@ -0,0 +1,540 @@ + + + + + + + %YAML 1.1 +--- +# yaml-language-server: $schema=https://harp-tech.org/draft-02/schema/device.json +device: Behavior +whoAmI: 1216 +firmwareVersion: "3.2" +hardwareTargets: "1.1" +registers: + DigitalInputState: + address: 32 + access: Event + type: U8 + maskType: DigitalInputs + description: Reflects the state of DI digital lines of each Port + Reserved0: &reserved + address: 33 + type: U8 + access: Read + description: Reserved for future use + visibility: private + OutputSet: &output + address: 34 + type: U16 + access: Write + maskType: DigitalOutputs + description: Set the specified digital output lines. + OutputClear: + <<: *output + address: 35 + description: Clear the specified digital output lines + OutputToggle: + <<: *output + address: 36 + description: Toggle the specified digital output lines + OutputState: + <<: *output + address: 37 + description: Write the state of all digital output lines + PortDIOSet: &portDIO + address: 38 + type: U8 + access: Write + maskType: PortDigitalIOS + description: Set the specified port DIO lines + PortDIOClear: + <<: *portDIO + address: 39 + description: Clear the specified port DIO lines + PortDIOToggle: + <<: *portDIO + address: 40 + description: Toggle the specified port DIO lines + PortDIOState: + <<: *portDIO + address: 41 + description: Write the state of all port DIO lines + PortDIODirection: + <<: *portDIO + address: 42 + description: Specifies which of the port DIO lines are outputs + PortDIOStateEvent: + <<: *portDIO + address: 43 + access: Event + description: Specifies the state of the port DIO lines on a line change + AnalogData: + address: 44 + type: S16 + length: 3 + access: Event + description: Voltage at the ADC input and encoder value on Port 2 + payloadSpec: + AnalogInput0: + offset: 0 + description: The voltage at the output of the ADC channel 0. + Encoder: + offset: 1 + description: The quadrature counter value on Port 2 + AnalogInput1: + offset: 2 + description: The voltage at the output of the ADC channel 1. + OutputPulseEnable: + <<: *output + address: 45 + description: Enables the pulse function for the specified output lines + PulseDOPort0: &pulseDO + address: 46 + type: U16 + access: Write + minValue: 1 + description: Specifies the duration of the output pulse in milliseconds. + PulseDOPort1: + <<: *pulseDO + address: 47 + PulseDOPort2: + <<: *pulseDO + address: 48 + PulseSupplyPort0: + <<: *pulseDO + address: 49 + PulseSupplyPort1: + <<: *pulseDO + address: 50 + PulseSupplyPort2: + <<: *pulseDO + address: 51 + PulseLed0: + <<: *pulseDO + address: 52 + PulseLed1: + <<: *pulseDO + address: 53 + PulseRgb0: + <<: *pulseDO + address: 54 + PulseRgb1: + <<: *pulseDO + address: 55 + PulseDO0: + <<: *pulseDO + address: 56 + PulseDO1: + <<: *pulseDO + address: 57 + PulseDO2: + <<: *pulseDO + address: 58 + PulseDO3: + <<: *pulseDO + address: 59 + PwmFrequencyDO0: &pwmFreq + address: 60 + type: U16 + access: Write + minValue: 1 + description: Specifies the frequency of the PWM at DO0. + PwmFrequencyDO1: + <<: *pwmFreq + address: 61 + description: Specifies the frequency of the PWM at DO1. + PwmFrequencyDO2: + <<: *pwmFreq + address: 62 + description: Specifies the frequency of the PWM at DO2. + PwmFrequencyDO3: + <<: *pwmFreq + address: 63 + description: Specifies the frequency of the PWM at DO3. + PwmDutyCycleDO0: &pwmDutyCycle + address: 64 + type: U8 + access: Write + minValue: 1 + maxValue: 99 + description: Specifies the duty cycle of the PWM at DO0. + PwmDutyCycleDO1: + <<: *pwmDutyCycle + address: 65 + description: Specifies the duty cycle of the PWM at DO1. + PwmDutyCycleDO2: + <<: *pwmDutyCycle + address: 66 + description: Specifies the duty cycle of the PWM at DO2. + PwmDutyCycleDO3: + <<: *pwmDutyCycle + address: 67 + description: Specifies the duty cycle of the PWM at DO3. + PwmStart: &pwmStartStop + address: 68 + type: U8 + access: Write + maskType: PwmOutputs + description: Starts the PWM on the selected output lines. + PwmStop: + <<: *pwmStartStop + address: 69 + description: Stops the PWM on the selected output lines. + RgbAll: + address: 70 + type: &rgbType U8 + length: 6 + access: &rgbAccess Write + description: Specifies the state of all RGB LED channels. + payloadSpec: + Green0: + offset: 0 + description: The intensity of the green channel in the RGB0 LED. + Red0: + offset: 1 + description: The intensity of the red channel in the RGB0 LED. + Blue0: + offset: 2 + description: The intensity of the blue channel in the RGB0 LED. + Green1: + offset: 3 + description: The intensity of the green channel in the RGB1 LED. + Red1: + offset: 4 + description: The intensity of the red channel in the RGB1 LED. + Blue1: + offset: 5 + description: The intensity of the blue channel in the RGB1 LED. + Rgb0: &rgbRegister + address: 71 + type: *rgbType + length: 3 + access: *rgbAccess + description: Specifies the state of the RGB0 LED channels. + interfaceType: RgbPayload + payloadSpec: + Green: + offset: 0 + description: The intensity of the green channel in the RGB LED. + Red: + offset: 1 + description: The intensity of the red channel in the RGB LED. + Blue: + offset: 2 + description: The intensity of the blue channel in the RGB LED. + Rgb1: + <<: *rgbRegister + address: 72 + description: Specifies the state of the RGB1 LED channels. + Led0Current: &ledCurrent + address: 73 + type: U8 + access: Write + minValue: 2 + maxValue: 100 + description: Specifies the configuration of current to drive LED 0. + Led1Current: + <<: *ledCurrent + address: 74 + description: Specifies the configuration of current to drive LED 1. + Led0MaxCurrent: &ledMaxCurrent + address: 75 + type: U8 + access: Write + minValue: 5 + maxValue: 100 + description: Specifies the configuration of current to drive LED 0. + Led1MaxCurrent: + <<: *ledMaxCurrent + address: 76 + description: Specifies the configuration of current to drive LED 1. + EventEnable: + address: 77 + type: U8 + access: Write + maskType: Events + description: Specifies the active events in the device. + StartCameras: &cameraControl + address: 78 + type: U8 + access: Write + maskType: CameraOutputs + description: Specifies the camera outputs to enable in the device. + StopCameras: + <<: *cameraControl + access: [Write, Event] + address: 79 + description: Specifies the camera outputs to disable in the device. An event will be issued when the trigger signal is actually stopped being generated. + EnableServos: &servoControl + address: 80 + type: U8 + access: Write + maskType: ServoOutputs + description: Specifies the servo outputs to enable in the device. + DisableServos: + <<: *servoControl + address: 81 + description: Specifies the servo outputs to disable in the device. + EnableEncoders: + address: 82 + type: U8 + access: Write + maskType: EncoderInputs + description: Specifies the port quadrature counters to enable in the device. + EncoderMode: + address: 83 + type: U8 + access: Write + maskType: EncoderModeConfig + description: Configures the operation mode of the quadrature encoders. + Reserved2: + <<: *reserved + address: 84 + Reserved3: + <<: *reserved + address: 85 + Reserved4: + <<: *reserved + address: 86 + Reserved5: + <<: *reserved + address: 87 + Reserved6: + <<: *reserved + address: 88 + Reserved7: + <<: *reserved + address: 89 + Reserved8: + <<: *reserved + address: 90 + Reserved9: + <<: *reserved + address: 91 + Camera0Frame: &frameAcquired + address: 92 + type: U8 + access: Event + maskType: FrameAcquired + description: Specifies that a frame was acquired on camera 0. + Camera0Frequency: &cameraFreq + address: 93 + type: U16 + access: Write + minValue: 1 + maxValue: 600 + description: Specifies the trigger frequency for camera 0. + Camera1Frame: + <<: *frameAcquired + address: 94 + description: Specifies that a frame was acquired on camera 1. + Camera1Frequency: + <<: *cameraFreq + address: 95 + description: Specifies the trigger frequency for camera 1. + Reserved10: + <<: *reserved + address: 96 + Reserved11: + <<: *reserved + address: 97 + Reserved12: + <<: *reserved + address: 98 + Reserved13: + <<: *reserved + address: 99 + ServoMotor2Period: &servoPeriod + address: 100 + type: U16 + access: Write + minValue: 2 + maxValue: 65534 + description: Specifies the period of the servo motor in DO2, in microseconds. + ServoMotor2Pulse: &servoPulse + address: 101 + type: U16 + access: Write + minValue: 6 + maxValue: 65530 + description: Specifies the pulse of the servo motor in DO2, in microseconds. + ServoMotor3Period: + <<: *servoPeriod + address: 102 + description: Specifies the period of the servo motor in DO3, in microseconds. + ServoMotor3Pulse: + <<: *servoPulse + address: 103 + description: Specifies the pulse of the servo motor in DO3, in microseconds. + Reserved14: + <<: *reserved + address: 104 + Reserved15: + <<: *reserved + address: 105 + Reserved16: + <<: *reserved + address: 106 + Reserved17: + <<: *reserved + address: 107 + EncoderReset: + address: 108 + type: U8 + access: Write + maskType: EncoderInputs + description: Reset the counter of the specified encoders to zero. + Reserved18: + <<: *reserved + address: 109 + EnableSerialTimestamp: + address: 110 + type: U8 + access: Write + description: Enables the timestamp for serial TX. + MimicPort0IR: &mimic + address: 111 + type: U8 + access: Write + maskType: MimicOutput + description: Specifies the digital output to mimic the Port 0 IR state. + MimicPort1IR: + <<: *mimic + address: 112 + description: Specifies the digital output to mimic the Port 1 IR state. + MimicPort2IR: + <<: *mimic + address: 113 + description: Specifies the digital output to mimic the Port 2 IR state. + Reserved20: + <<: *reserved + address: 114 + Reserved21: + <<: *reserved + address: 115 + Reserved22: + <<: *reserved + address: 116 + MimicPort0Valve: + <<: *mimic + address: 117 + description: Specifies the digital output to mimic the Port 0 valve state. + MimicPort1Valve: + <<: *mimic + address: 118 + description: Specifies the digital output to mimic the Port 1 valve state. + MimicPort2Valve: + <<: *mimic + address: 119 + description: Specifies the digital output to mimic the Port 2 valve state. + Reserved23: + <<: *reserved + address: 120 + Reserved24: + <<: *reserved + address: 121 + PokeInputFilter: + address: 122 + type: U8 + access: Write + description: Specifies the low pass filter time value for poke inputs, in ms. +bitMasks: + DigitalInputs: + description: Specifies the state of port digital input lines. + bits: + DIPort0: 0x1 + DIPort1: 0x2 + DIPort2: 0x4 + DI3: 0x8 + DigitalOutputs: + description: Specifies the state of port digital output lines. + bits: + DOPort0: 0x1 + DOPort1: 0x2 + DOPort2: 0x4 + SupplyPort0: 0x8 + SupplyPort1: 0x10 + SupplyPort2: 0x20 + Led0: 0x40 + Led1: 0x80 + Rgb0: 0x100 + Rgb1: 0x200 + DO0: 0x400 + DO1: 0x800 + DO2: 0x1000 + DO3: 0x2000 + PortDigitalIOS: + description: Specifies the state of the port DIO lines. + bits: + DIO0: 0x1 + DIO1: 0x2 + DIO2: 0x4 + PwmOutputs: + description: Specifies the state of PWM output lines. + bits: + PwmDO0: 0x1 + PwmDO1: 0x2 + PwmDO2: 0x4 + PwmDO3: 0x8 + Events: + description: Specifies the active events in the device. + bits: + PortDI: 0x1 + PortDIO: 0x2 + AnalogData: 0x4 + Camera0: 0x8 + Camera1: 0x10 + CameraOutputs: + description: Specifies camera output enable bits. + bits: + CameraOutput0: 0x1 + CameraOutput1: 0x2 + ServoOutputs: + description: Specifies servo output enable bits. + bits: + ServoOutput2: 0x4 + ServoOutput3: 0x8 + EncoderInputs: + description: Specifies quadrature counter enable bits. + bits: + EncoderPort2: 0x4 + FrameAcquired: + description: Specifies that camera frame was acquired. + bits: + FrameAcquired: 0x1 +groupMasks: + MimicOutput: + description: Specifies the target IO on which to mimic the specified register. + values: + None: 0 + DIO0: 1 + DIO1: 2 + DIO2: 3 + DO0: 4 + DO1: 5 + DO2: 6 + DO3: 7 + EncoderModeConfig: + description: Specifies the type of reading made from the quadrature encoder. + values: + Position: 0 + Displacement: 1 + + + + + 1 + + + + + + + + + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index d82c534..9fbabdc 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -10,8 +10,10 @@ xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p4="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:p5="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" + xmlns:p5="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" + xmlns:p6="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:gui="clr-namespace:Bonsai.Gui;assembly=Bonsai.Gui" + xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -123,77 +125,52 @@ HarpDevices - - HarpBehavior - - - - RigSchema - - - HarpBehavior.PortName - - - - - - - - COM5 - TriggerHarpReadDump - - - HarpBehaviorEvents - - - - - - Seconds - - - HarpTimestampSource - - - HarpBehaviorEvents - - - - 1 - - - - Write - - PortDI PortDIO AnalogData Camera0 Camera1 - - - - HarpBehaviorCommands - - - - - - - - - - - - - - - + StartExperiment TriggerHarpReadDump + + RigSchema + + + HarpWhiteRabbit + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpWhiteRabbit + + + + + + + + + + + + + @@ -629,17 +606,67 @@ - - LoggingRootPath + + + + + + + + + Behavior + Behavior + + + HarpWhiteRabbitEvents + + + + + + + + + + + Modality + + + + + + + + Behavior - - + ClockGenerator + + + RigSchema + + + HarpWhiteRabbit + + + + - + - + + + + + + + + + + + + @@ -669,9 +696,9 @@ - - - + + + @@ -682,11 +709,62 @@ - - LoggingRootPath + + + + + + + + + Behavior + HarpCommands/Behavior + + + HarpWhiteRabbitCommands + + + HarpTimestampSource + + + + + + + + + + + + Modality + + + + + + + + + + + + + + + + Behavior - - + HarpCommands/ClockGenerator + + + RigSchema + + + HarpWhiteRabbit + + + + @@ -695,9 +773,23 @@ - + - + + + + + + + + + + + + + + + @@ -762,30 +854,11 @@ SoftwareEvent - - Repository - - - - false - - - - - IsRepositoryClean - - - - SoftwareEvent - - - - @@ -1039,7 +1112,7 @@ LoggingRootPath - endsession + EndSession @@ -1413,6 +1486,13 @@ true Microsoft Sans Serif, 16pt + + JustFrames + true + + + + EndExperiment @@ -1463,10 +1543,11 @@ - + + \ No newline at end of file From 4ad9d99082fab9795d6f84696a6592f38d6f326a Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:52:35 -0700 Subject: [PATCH 11/32] Use saturation visualizer --- .../InstantitateTriggeredCameras.bonsai | 34 ++- ...ameraControllerSaturationVisualizer.bonsai | 220 ++++++++++++++++++ src/main.bonsai | 151 +++++++----- 3 files changed, 340 insertions(+), 65 deletions(-) create mode 100644 src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai diff --git a/src/Extensions/InstantitateTriggeredCameras.bonsai b/src/Extensions/InstantitateTriggeredCameras.bonsai index 466c0d9..775e9b8 100644 --- a/src/Extensions/InstantitateTriggeredCameras.bonsai +++ b/src/Extensions/InstantitateTriggeredCameras.bonsai @@ -1,5 +1,5 @@  - + + + 0 + + + + + 1 + + TriggeredCamerasInitialized @@ -393,6 +403,9 @@ 1 + + + TriggeredCameraController @@ -498,19 +511,22 @@ - - - + + + - - + + - + - - + + + + + diff --git a/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai new file mode 100644 index 0000000..66e3118 --- /dev/null +++ b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai @@ -0,0 +1,220 @@ + + + + + + Source1 + + + + + + Source1 + + + CamerasStream + + + + CamerasStream + + + Key + + + + + + true + true + + + + SelectedControllerCamera + + + + + + SelectedControllerCamera + + + + + + GetStream + + + + Source1 + + + + 1 + + + + Camera + + + + + + CamerasStream + + + Camera + + + + + + + + + + + Source1 + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value.Image + + + 5 + 250 + 1 + + + + + + + false + + + + + 1 + + + + CamerasStream + + + + true + + + + + + + + + + + + + ControllerVisualization + true + true + 1 + 2 + + + + Percent + 0.1 + + + Percent + 0.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index 9fbabdc..ad42986 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -402,8 +402,8 @@ SaveRawVideo - - QualityControl + + RigQA @@ -450,46 +450,65 @@ - - Repository - - - - false - - - - - SubjectSchema - - - AllowDirtyRepo - - - - - - AllowDirty? - Item2 ? False : Item1 - - + + IsRepoClean - - Source1 + + Repository + + + + false + + + + + SubjectSchema + + + AllowDirtyRepo + + + + + + AllowDirty? + Item2 ? False : Item1 + + + + + + Source1 + + + + + + + + + + + Repository is not clean! Please discard all local changes. + + + + + + + + + - - - Repository is not clean! Please discard all local changes. - - ControllersInitialized @@ -543,26 +562,41 @@ - - + + - - - - - - - - + + SubjectSchema + + + SkipHardwareValidation + + + + + + + Source1 + + + + + + + + + + + Logging @@ -1413,7 +1447,7 @@ - + @@ -1463,7 +1497,7 @@ - + @@ -1532,22 +1566,27 @@ - + + - - - + + + - - - - - - - + + + + + + + - + + + + + \ No newline at end of file From 7f70b804f4dc5ba1970d392a1b5fb6cb8e15aa63 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Fri, 7 Nov 2025 09:47:08 -0800 Subject: [PATCH 12/32] Split into include workflows --- src/Extensions/Cameras.bonsai | 216 +++++++++++ src/Extensions/HarpDevices.bonsai | 56 +++ src/Extensions/Visualizers.bonsai | 275 ++++++++++++++ src/main.bonsai | 605 ++++-------------------------- 4 files changed, 615 insertions(+), 537 deletions(-) create mode 100644 src/Extensions/Cameras.bonsai create mode 100644 src/Extensions/HarpDevices.bonsai create mode 100644 src/Extensions/Visualizers.bonsai diff --git a/src/Extensions/Cameras.bonsai b/src/Extensions/Cameras.bonsai new file mode 100644 index 0000000..032f8b1 --- /dev/null +++ b/src/Extensions/Cameras.bonsai @@ -0,0 +1,216 @@ + + + + + + ControllersInitialized + + + + CameraController0 + + + + RigSchema + + + TriggeredCameraController0 + + + CameraOutput0 + + + Item2 + Item1 + + + TriggeredCamerasStream0 + + + + RigSchema + + + TriggeredCameraController0 + + + + + + + + + + + + + + + + + + + + + + CameraController1 + + + + RigSchema + + + TriggeredCameraController1 + + + CameraOutput1 + + + Item2 + Item1 + + + TriggeredCamerasStream1 + + + + RigSchema + + + TriggeredCameraController1 + + + + + + + + + + + + + + + + + + + + + + ControllersInitialized + + + StartCameras + None + + + + 1 + + + + + + + Source1 + + + Accumulation,Value + + + + + + + it + + + StartCameras + CameraOutput0 CameraOutput1 + + + + + + + + + + + + + + + + + CameraControllersActive + + + CameraControllersActive + + + Write + + + + HarpBehaviorCommands + + + StartExperiment + + + + PT1S + + + + + + + CameraControllersActive + + + Write + + + + HarpBehaviorCommands + + + EndExperiment + + + + PT1S + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HarpDevices.bonsai b/src/Extensions/HarpDevices.bonsai new file mode 100644 index 0000000..8f6199e --- /dev/null +++ b/src/Extensions/HarpDevices.bonsai @@ -0,0 +1,56 @@ + + + + + + + StartExperiment + + + TriggerHarpReadDump + + + RigSchema + + + HarpWhiteRabbit + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpWhiteRabbit + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai new file mode 100644 index 0000000..59a3e86 --- /dev/null +++ b/src/Extensions/Visualizers.bonsai @@ -0,0 +1,275 @@ + + + + + + + 0 + + + + ExperimentControlUI + + + + IsExperimentRunning + + + + + + + + + StartButton + true + true + Start! + + + + + + Source1 + + + + 1 + + + + + StartLogging + + + + true + + + + IsExperimentRunning + + + + + + + + + + + + + + + + IsExperimentRunning + + + + + + + + EndButton + true + true + End Session + + + + + + Source1 + + + + EndExperiment + + + + false + + + + IsExperimentRunning + + + + + + + + + + + + + + + true + true + 1 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + Controller0Visualization + + + + TriggeredCamerasStream0 + + + RigSchema + + + TriggeredCameraController0 + + + !IsNullOrEmpty + it != null ? (it.Cameras.Count > 0) : false + + + + + + Source1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + Controller1Visualization + + + + TriggeredCamerasStream1 + + + RigSchema + + + TriggeredCameraController1 + + + !IsNullOrEmpty + it != null ? (it.Cameras.Count > 0) : false + + + + + + Source1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UserInterface + true + true + Microsoft Sans Serif, 16pt + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index ad42986..33af66b 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -5,14 +5,13 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p2="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p3="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" - xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" - xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p4="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:p5="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:p6="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - xmlns:gui="clr-namespace:Bonsai.Gui;assembly=Bonsai.Gui" + xmlns:p6="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:p7="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -107,6 +106,36 @@ SoftwareEvent + + EndExperiment + + + StartLogging + + + StartLogging + + + + PT1S + + + + StartExperiment + + + + false + + + + + 1 + + + + IsExperimentRunning + @@ -114,6 +143,10 @@ + + + + @@ -121,270 +154,8 @@ Hardware - - HarpDevices - - - - - StartExperiment - - - TriggerHarpReadDump - - - RigSchema - - - HarpWhiteRabbit - - - PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpWhiteRabbit - - - - - - - - - - - - - - - - - - - - - Cameras - - - - ControllersInitialized - - - - CameraController0 - - - - RigSchema - - - TriggeredCameraController0 - - - CameraOutput0 - - - Item2 - Item1 - - - TriggeredCamerasStream0 - - - - RigSchema - - - TriggeredCameraController0 - - - - - - - - - - - - - - - - - - - - - - CameraController1 - - - - RigSchema - - - TriggeredCameraController1 - - - CameraOutput1 - - - Item2 - Item1 - - - TriggeredCamerasStream1 - - - - RigSchema - - - TriggeredCameraController1 - - - - - - - - - - - - - - - - - - - - - - ControllersInitialized - - - StartCameras - None - - - - 1 - - - - - - - Source1 - - - Accumulation,Value - - - - - - - it - - - StartCameras - CameraOutput0 CameraOutput1 - - - - - - - - - - - - - - - - - CameraControllersActive - - - CameraControllersActive - - - Write - - - - HarpBehaviorCommands - - - StartExperiment - - - - PT1S - - - - - - - CameraControllersActive - - - Write - - - - HarpBehaviorCommands - - - EndExperiment - - - - PT1S - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -490,8 +261,8 @@ - - Repository is not clean! Please discard all local changes. + + Repository is not clean! Please discard all local changes. @@ -546,7 +317,7 @@ - + @@ -608,7 +379,7 @@ - + Modality Behavior @@ -655,7 +426,7 @@ HarpWhiteRabbitEvents - + @@ -730,9 +501,9 @@ - - - + + + @@ -764,9 +535,9 @@ - - - + + + @@ -778,7 +549,7 @@ - + @@ -854,7 +625,7 @@ - + Modality @@ -881,8 +652,8 @@ Head - - RepositoryStatus + + RepositoryStatus @@ -1105,8 +876,8 @@ - - SoftwareEvent + + SoftwareEvent @@ -1119,7 +890,7 @@ - + @@ -1188,7 +959,7 @@ - + Modality BehaviorVideos @@ -1285,241 +1056,7 @@ - - ExperimentControlUI - - - - - false - - - - - 1 - - - - IsExperimentRunning - - - IsExperimentRunning - - - - - - - - - StartButton - true - true - Start! - - - - 1 - - - - - StartLogging - - - - true - - - - IsExperimentRunning - - - - IsExperimentRunning - - - - - - - - EndButton - true - true - End Session - - - - true - true - 1 - 2 - - - - - - - - EndExperiment - - - - false - - - - IsExperimentRunning - - - StartLogging - - - - PT1S - - - - StartExperiment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Controller0Visualization - - - - TriggeredCamerasStream0 - - - RigSchema - - - TriggeredCameraController0 - - - !IsNullOrEmpty - it != null ? (it.Cameras.Count > 0) : false - - - - - - Source1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Controller1Visualization - - - - TriggeredCamerasStream1 - - - RigSchema - - - TriggeredCameraController1 - - - !IsNullOrEmpty - it != null ? (it.Cameras.Count > 0) : false - - - - - - Source1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UserInterface - true - true - Microsoft Sans Serif, 16pt - + JustFrames true @@ -1535,11 +1072,6 @@ 1 - - - PT2S - - EndRoutine @@ -1560,6 +1092,11 @@ + + + PT2S + + @@ -1577,16 +1114,10 @@ - - + - - - - - - + \ No newline at end of file From b52bbc37c361a60ea26b584a083f97e373527c52 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:27:09 -0800 Subject: [PATCH 13/32] Temp --- bonsai/Bonsai.config | 13 +++ src/main.bonsai | 249 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 260 insertions(+), 2 deletions(-) diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index 42020c3..85b7b88 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -15,6 +15,7 @@ + @@ -43,6 +44,7 @@ + @@ -61,6 +63,8 @@ + + @@ -78,6 +82,8 @@ + + @@ -119,6 +125,7 @@ + @@ -141,6 +148,7 @@ + @@ -168,6 +176,7 @@ + @@ -184,6 +193,8 @@ + + @@ -203,6 +214,8 @@ + + diff --git a/src/main.bonsai b/src/main.bonsai index 33af66b..d15412a 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -6,11 +6,13 @@ xmlns:p2="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p3="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" + xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:p6="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:p7="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -154,7 +156,250 @@ Hardware - + + HarpDevices + + + + HarpBehaviorCommands + + + todo + + + + + 0 + + + + BehaviorBoard + + + + HarpBehaviorCommands + + + internalPub + + + RigSchema + + + HarpBehavior.PortName + + + + + + + + + Active + On + false + On + Enabled + false + COM5 + + + + + internalPub + + + MessageBytes + + + + tcp://localhost:5557 + + + + + + + + + + + + + + + + + todo + + + + + 0 + + + + ZeroMQBehaviorBoard + + + + + tcp://localhost:5557 + + + + Last.Buffer + + + + + + + + + + + + + + + + + + + 1 + + + + + + + HarpBehaviorEvents + + + HarpBehaviorEvents + + + + + + Seconds + + + HarpTimestampSource + + + BehaviorBoard + + + + + + + TriggerHarpReadDump + + + Write + + Active + true + false + On + On + Enabled + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + Write + + PortDI PortDIO AnalogData Camera0 Camera1 + + + + + 1 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + StartExperiment + + + TriggerHarpReadDump + + + RigSchema + + + HarpWhiteRabbit + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpWhiteRabbit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 010dbbe3859eb19bafd1aa0873dc8dec184a906c Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:59:24 -0800 Subject: [PATCH 14/32] Streamline camera observables --- src/Extensions/CameraQc.bonsai | 776 ++++++++++++++++-------------- src/Extensions/Cameras.bonsai | 135 +++--- src/Extensions/HarpDevices.bonsai | 204 ++++++-- src/main.bonsai | 651 +++++++++++++------------ 4 files changed, 1008 insertions(+), 758 deletions(-) diff --git a/src/Extensions/CameraQc.bonsai b/src/Extensions/CameraQc.bonsai index 31ffc99..b577de8 100644 --- a/src/Extensions/CameraQc.bonsai +++ b/src/Extensions/CameraQc.bonsai @@ -1,5 +1,5 @@  - - - Source1 - - - - - - - - CameraQC + CameraQc - - Source1 - - - - 1 - - - - TriggeredCameraController - - - - - TriggeredCamerasStream0 - - - ThisTriggeredCamerasStream - - - - ThisTriggeredCamerasStream + + + + - - CheckDroppedFrames + + CameraQC - - Source1 - - - - 1 - - - - InputSequence + + - InputSequence + TriggeredCamerasStreams - - + + ThisTriggeredCamerasStream + - - Value.ChunkData + + ThisTriggeredCamerasStream - FrameID - - - - 1 - + Item1 - - - 1 - - - - - 0 - - - + + CheckDroppedFrames Source1 + + + 1 + + + + InputSequence + + + InputSequence + + + + + + Value.ChunkData + + + FrameID + + + + 1 + + + + + 1 + + + + + 0 + + + + + + + Source1 + + + + + + + + + + InputSequence + + + Key + + + + + + Item2 + + + + + + + + + + + + + + - - InputSequence - - - Key - - + - - Item2 + + Camera {0} dropped frame detected during pre-session! + it - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} dropped frame detected during pre-session! - it - - - - - - it - - - - Dropped frame detected during pre-session! - - - - StartExperiment - - - - - - TriggeredCameraController - - - Cameras - - - - - - - - - CheckCameraSettings - - - - Source1 + + + + + it - - 1 + + Dropped frame detected during pre-session! - - ThisCamera - - ThisCamera + StartExperiment - - Value.Exposure + + - TriggeredCameraController - - - FrameRate - - - Value + TriggeredCamerasStreams - - - - - 0.0007 - + - - ToMilliseconds - int32(it*1000) - - - - - - ((1.0 / Item2) * 1000000) < double(Item1) + Item3 - - + + CheckCameraSettings Source1 + + stream + + + stream + + + Item2 + + + cameraController + + + stream + + + Item2 + + + Cameras + + + stream + + + Item1.Key + + + + + + + + + + + thisCamera + + + thisCamera + + + Exposure + + + cameraController + + + FrameRate + + + Value + + + + + + + 0.0007 + + + + ToMilliseconds + int32(it*1000) + + + + + + ((1.0 / Item2) * 1000000) < double(Item1) + Item3 + + + + + + Source1 + + + + + + + + + + + 1 + + + + stream + + + Item1.Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - 1 - + - - ThisCamera + + Camera {0} exposure setting not compatible with requested frame rate! + it - - Key + + + + + it - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} exposure setting not compatible with requested frame rate! - it - - - - - - it - - - - Dropped frame detected during pre-session! - - - - TriggeredCameraController - - - FrameRate.HasValue - - - - - - - Source1 - - - - - - - - - - - TriggeredCameraControl must specify a valid FrameRate property! - - - - ThisTriggeredCamerasStream - - - - - - - OnlineQC - - - - Source1 - - - - 1 + + Dropped frame detected during pre-session! - - InputSequence - - InputSequence - - - + TriggeredCamerasStreams - Value.ChunkData - - - Timestamp - - - - 1 - - - - - 1E-09 - + Item2 - Seconds - - - - 1 - - - - - - - - - - - - - - - 0.0005 - + FrameRate.HasValue + @@ -392,123 +335,216 @@ - - TaskPoolScheduler + + TriggeredCameraControl must specify a valid FrameRate property! - - + + ThisTriggeredCamerasStream - - - PT0S - PT10S - + + Item1 - - + + + - - MakeUI + + OnlineQC + + Source1 + + + + 1 + + + + InputSequence + InputSequence + + + - Key + Value.ChunkData - - Camera {0} out-of-alignment qc was triggered. - it + + Timestamp - - - - + + + 1 + + + + + 1E-09 + + + + Seconds + + + + 1 + + + + + + + + + + + + + + + 0.0005 + + + + + + + Source1 + + + + + + + - - - Warning - Exclamation + + TaskPoolScheduler + + + + + + PT0S + PT10S + + + + + + + MakeUI + + + + InputSequence + + + Key + + + Camera {0} out-of-alignment qc was triggered. + it + + + + + + + + + + Warning + Exclamation + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - - - + + - - - - + + + - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/Extensions/Cameras.bonsai b/src/Extensions/Cameras.bonsai index 032f8b1..06e0f94 100644 --- a/src/Extensions/Cameras.bonsai +++ b/src/Extensions/Cameras.bonsai @@ -3,6 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" + xmlns:p1="clr-namespace:AindJustFramesSchemas;assembly=Extensions" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -11,15 +12,28 @@ ControllersInitialized - - CameraController0 + + RigSchema + + + TriggeredCameraController0 + + + + CameraOutput0 + + Source1 + + + thisCameraController + - RigSchema + thisCameraController - - TriggeredCameraController0 + + CameraOutput0 @@ -28,44 +42,47 @@ Item2 Item1 - - TriggeredCamerasStream0 - - - RigSchema + thisCameraController - - TriggeredCameraController0 - - - + - - - - - - - - + + + + + + - - CameraController1 + + RigSchema + + + TriggeredCameraController1 + + + + CameraOutput1 + + Source1 + + + thisCameraController + - RigSchema + thisCameraController - - TriggeredCameraController1 + + CameraOutput1 @@ -74,35 +91,35 @@ Item2 Item1 - - TriggeredCamerasStream1 - - - RigSchema + thisCameraController - - TriggeredCameraController1 - - - + - - - - - - - - + + + + + + + + + + + + + + TriggeredCamerasStreams + + ControllersInitialized @@ -196,21 +213,31 @@ - - - + + + + + + - - - + + + - - + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HarpDevices.bonsai b/src/Extensions/HarpDevices.bonsai index 8f6199e..0b25592 100644 --- a/src/Extensions/HarpDevices.bonsai +++ b/src/Extensions/HarpDevices.bonsai @@ -2,55 +2,203 @@ - - - StartExperiment + + HarpBehaviorCommands - - TriggerHarpReadDump + + todo + - - RigSchema + + + 0 + - - HarpWhiteRabbit + + BehaviorBoard + + + + HarpBehaviorCommands + + + internalPub + + + RigSchema + + + HarpBehavior.PortName + + + + + + + + + Active + On + false + On + Enabled + false + COM5 + + + + + internalPub + + + MessageBytes + + + + tcp://localhost:5557 + + + + + + + + + + + + + + - - PortName + + todo + - - - - + + + 0 + - - COMx - TriggerHarpReadDump + + ZeroMQBehaviorBoard + + + + + tcp://localhost:5557 + + + + Last.Buffer + + + + + + + + + + + + - - RigSchema + + - - HarpWhiteRabbit + + + 1 + - - + + + + HarpBehaviorEvents + + + todo + + + + BehaviorBoardInitialization + + + + + + + TriggerHarpReadDump + + + Write + + Active + true + false + On + On + Enabled + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + Write + + PortDI PortDIO AnalogData Camera0 Camera1 + + + + + 1 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + StartExperiment + + + TriggerHarpReadDump - + + - - + + - + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index d15412a..dddf0f7 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -6,14 +6,13 @@ xmlns:p2="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p3="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" + xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" - xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:p6="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:p7="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" + xmlns:p6="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -138,6 +137,65 @@ IsExperimentRunning + + IsRepoClean + + + + Repository + + + + false + + + + + SubjectSchema + + + AllowDirtyRepo + + + + + + AllowDirty? + Item2 ? False : Item1 + + + + + + Source1 + + + + + + + + + + + Repository is not clean! Please discard all local changes. + + + + + + + + + + + + + + + + + @@ -276,20 +334,12 @@ HarpBehaviorEvents - - HarpBehaviorEvents - - - - - - Seconds - - - HarpTimestampSource + + todo + - BehaviorBoard + BehaviorBoardInitialization @@ -346,34 +396,6 @@ TriggerHarpReadDump - - RigSchema - - - HarpWhiteRabbit - - - PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpWhiteRabbit - - - - - @@ -386,210 +408,320 @@ - - - - - - - - - - - - - - - - - - false - - - - - 1 - - - - SaveRawVideo - - - RigQA - - - - RigSchema - - - TriggeredCameraController0 - - - TriggeredCamerasStream0 - 0.0007 - 0.0005 - PT10S - - - RigSchema - - - TriggeredCameraController0 - - - - - - - RigSchema - - - TriggeredCameraController1 - - - TriggeredCamerasStream1 - 0.0007 - 0.0005 - PT10S - - - RigSchema - - - TriggeredCameraController1 - - - - - - IsRepoClean + Cameras + + ControllersInitialized + + - Repository + RigSchema - - - false - + + TriggeredCameraController0 + + + + CameraOutput0 + + + + Source1 + + + thisCameraController + + + thisCameraController + + + + + + CameraOutput0 + + + Item2 + Item1 + + + thisCameraController + + + + + + + + + + + + + + + + - - SubjectSchema + RigSchema - AllowDirtyRepo + TriggeredCameraController1 + + + + CameraOutput1 + + + + Source1 + + + thisCameraController + + + thisCameraController + + + + + + CameraOutput1 + + + Item2 + Item1 + + + thisCameraController + + + + + + + + + + + + + + + + - + - - AllowDirty? - Item2 ? False : Item1 + + - + + TriggeredCamerasStreams + + + + ControllersInitialized + + + StartCameras + None + + + + 1 + + + Source1 + + Accumulation,Value + + + + + + + it + + + StartCameras + CameraOutput0 CameraOutput1 + + + + + - - Repository is not clean! Please discard all local changes. + + + + CameraControllersActive + + + CameraControllersActive + + + Write + + + + HarpBehaviorCommands + + + StartExperiment + + + + PT1S - + + + + + CameraControllersActive + + + Write + + + + HarpBehaviorCommands + + + EndExperiment + + + + PT1S + + + + + - - + - + - + + + + + + + + + + + + + + + + + + - ControllersInitialized + HarpBehaviorEvents - - + + - - RigSchema - - - ExpectedControllers - (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) - - - - - - - - - - Source1 - - - - - - - - - - StartExperiment - - - + + Seconds - - + + HarpTimestampSource - - - + - - - - - - - - - - - - - - - - + + + + + + false + + + + + 1 + + + + SaveRawVideo + + + + ControllersInitialized + + + + + + RigSchema + + + ExpectedControllers + (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) + + + + + + + + + + Source1 + + + + + + + StartExperiment + + + + + + + SubjectSchema @@ -667,40 +799,6 @@ Behavior Behavior - - HarpWhiteRabbitEvents - - - - - - - - - - - Modality - - - - - - - - - Behavior - ClockGenerator - - - RigSchema - - - HarpWhiteRabbit - - - - - @@ -708,15 +806,6 @@ - - - - - - - - - @@ -746,9 +835,9 @@ - - - + + + @@ -770,52 +859,6 @@ Behavior HarpCommands/Behavior - - HarpWhiteRabbitCommands - - - HarpTimestampSource - - - - - - - - - - - - Modality - - - - - - - - - - - - - - - - - Behavior - HarpCommands/ClockGenerator - - - RigSchema - - - HarpWhiteRabbit - - - - - @@ -828,18 +871,6 @@ - - - - - - - - - - - - @@ -1348,21 +1379,29 @@ - - + - - + + + - - + + + - - + + + + + + + + + \ No newline at end of file From 8a7af95b0832ebba59c46e9b1e5562d770f1f83b Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Fri, 7 Nov 2025 16:20:14 -0800 Subject: [PATCH 15/32] Cleanup code for N camera acquisition --- ...ameraControllerSaturationVisualizer.bonsai | 288 ++++---- src/Extensions/TriggeredCamerasLogger.bonsai | 317 +++------ src/Extensions/Visualizers.bonsai | 342 ++++------ src/main.bonsai | 640 +++--------------- 4 files changed, 441 insertions(+), 1146 deletions(-) diff --git a/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai index 66e3118..c952fcf 100644 --- a/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai +++ b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai @@ -16,205 +16,183 @@ Source1 - + + CamerasStream + + + + CamerasStream + + + Key + + + + + + true + true + + + + SelectedControllerCamera + + + + + + SelectedControllerCamera + + + GetStream - + Source1 - - CamerasStream - - - - CamerasStream - - - Key - - - - - true - true - + + 1 + - - SelectedControllerCamera + + Camera - - + + CamerasStream - SelectedControllerCamera + Camera - - + + + + - - GetStream + Source1 - - - 1 - - - - Camera + + Key - + - - CamerasStream - - - Camera - - - - - - - - - - - Source1 - - - Key - - - - - - - - - - - - - - - - - - - + + - + + - - - - - - - - - - Value.Image - - - 5 - 250 - 1 - - - - - - - false - - - - - 1 - - - - CamerasStream - - - - true - - - - - - - - - - ControllerVisualization - true - true - 1 - 2 - - - - Percent - 0.1 - - - Percent - 0.9 - - - - - - + + - + - - - - - - - - - - - - - - - + + + + + + Value.Image + + + 5 + 250 + 1 + + + + + + + false + + + + + 1 + + + + CamerasStream + + + + true + + + + + + + + + + + + + ControllerVisualization + true + true + 1 + 2 + + + + Percent + 0.1 + + + Percent + 0.9 + + + + - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/TriggeredCamerasLogger.bonsai b/src/Extensions/TriggeredCamerasLogger.bonsai index f924fbb..532cb0e 100644 --- a/src/Extensions/TriggeredCamerasLogger.bonsai +++ b/src/Extensions/TriggeredCamerasLogger.bonsai @@ -10,56 +10,64 @@ Source1 - - - - + TriggeredCamerasLogger Source1 - - - 1 - - - TriggeredCameraController + thisStream + + + thisStream - - + + Item2 + + + thisCameraController - TriggeredCamerasStream0 + thisStream + + + Item1.Key - - TriggeredCamerasStream - + + thisCameraName - TriggeredCameraController + thisCameraController Cameras - - + + thisCameraName + + + + + + + + + + + thisCamera + + + thisCamera - Value.VideoWriter + VideoWriter - - Key - - - - FfmpegWriter @@ -67,72 +75,20 @@ Source1 - - - 1 - - - - This - - - This - - - Item2 - - ThisCameraName + ThisWriter - This + thisStream Item1 - - ThisWriter - - - TriggeredCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - 1 - - - ThisCameraName + thisCameraName @@ -191,7 +147,7 @@ - ThisCameraName + thisCameraName @@ -244,63 +200,35 @@ - + - - + + + - + + - - - - - + + + + + - + - + - + - + - - - - - - - - - - - - - TriggeredCameraController - - - Cameras - - - - - - Value.VideoWriter - - - - Key - - - - OpenCvWriter @@ -308,72 +236,20 @@ Source1 - - - 1 - - - This - - - This - - - Item2 - - - ThisCameraName + ThisWriter - This + thisStream Item1 - - ThisWriter - - - TriggeredCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - 1 - - - ThisCameraName + thisCameraName @@ -416,7 +292,7 @@ FMP4 - ThisCameraName + thisCameraName @@ -469,75 +345,72 @@ - + - - + + + - + + - - - - + + + + - - - - - - - + + + + + + + - - - - - - - - + + + 1 + + + + + - + - + - - - + - - - + + + + - - + - - - - - + + + - - - + + \ No newline at end of file diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai index 59a3e86..691ba39 100644 --- a/src/Extensions/Visualizers.bonsai +++ b/src/Extensions/Visualizers.bonsai @@ -3,101 +3,128 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:gui="clr-namespace:Bonsai.Gui;assembly=Bonsai.Gui" - xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns="https://bonsai-rx.org/2018/workflow"> - - - 0 - + + Source1 - - ExperimentControlUI + + Visualizers - - IsExperimentRunning - - - - - - - - - StartButton - true - true - Start! + + + 0 + - + + ExperimentControlUI - - Source1 + + IsExperimentRunning - - - 1 - + + + + + - - - StartLogging + + StartButton + true + true + Start! - - - true - + + + + + Source1 + + + + 1 + + + + + StartLogging + + + + true + + + + IsExperimentRunning + + + + + + + + + + + + - + + IsExperimentRunning - - - - - - - - - - - - - - - IsExperimentRunning - - - - - - - - EndButton - true - true - End Session - - - - - - Source1 + + + + - - - EndExperiment + + EndButton + true + true + End Session - - - false - + + + + + Source1 + + + + EndExperiment + + + + false + + + + IsExperimentRunning + + + + + + + + + + + - - IsExperimentRunning + + + true + true + 1 + 2 + + + @@ -107,169 +134,54 @@ + + + + + + + - - - true - true - 1 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - Controller0Visualization - - - - TriggeredCamerasStream0 + + - RigSchema + TriggeredCamerasStreams - TriggeredCameraController0 - - - !IsNullOrEmpty - it != null ? (it.Cameras.Count > 0) : false - - - - - - Source1 - - - - - - - - - - + Item1 - - - - - - - - - - - - - - - - - - - 0 - - - - Controller1Visualization - - - - TriggeredCamerasStream1 + + - - RigSchema - - - TriggeredCameraController1 - - - !IsNullOrEmpty - it != null ? (it.Cameras.Count > 0) : false - - - - - - Source1 - - - - - - - - - - + + UserInterface + true + true + Microsoft Sans Serif, 16pt - - + - + - + - + + - - - - - UserInterface - true - true - Microsoft Sans Serif, 16pt - - - - - - - - - \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index dddf0f7..f822b28 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -8,9 +8,8 @@ xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" - xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" - xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:p6="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" @@ -104,6 +103,19 @@ CompoundRootPath + + + false + + + + + 1 + + + + SaveRawVideo + SoftwareEvent @@ -203,10 +215,12 @@ - - + + + + @@ -214,514 +228,77 @@ Hardware - - HarpDevices - - - - HarpBehaviorCommands - - - todo - - - - - 0 - - - - BehaviorBoard - - - - HarpBehaviorCommands - - - internalPub - - - RigSchema - - - HarpBehavior.PortName - - - - - - - - - Active - On - false - On - Enabled - false - COM5 - - - - - internalPub - - - MessageBytes - - - - tcp://localhost:5557 - - - - - - - - - - - - - - - - - todo - - - - - 0 - - - - ZeroMQBehaviorBoard - - - - - tcp://localhost:5557 - - - - Last.Buffer - - - - - - - - - - - - - - - - - - - 1 - - - - - - - HarpBehaviorEvents - - - todo - - - - BehaviorBoardInitialization - - - - - - - TriggerHarpReadDump - - - Write - - Active - true - false - On - On - Enabled - - - - HarpBehaviorCommands - - - HarpBehaviorEvents - - - Write - - PortDI PortDIO AnalogData Camera0 Camera1 - - - - - 1 - - - - HarpBehaviorCommands - - - - - - - - - - - - - - StartExperiment - - - TriggerHarpReadDump - - - - - - - - - - - - - - - - + + + + HarpBehaviorEvents - - Cameras + + + + + Seconds + + + HarpTimestampSource + + + ControllersInitialized + + + + + + RigSchema + + + ExpectedControllers + (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) + + + + + + - - ControllersInitialized - - - - RigSchema - - - TriggeredCameraController0 - - - - CameraOutput0 - - - - Source1 - - - thisCameraController - - - thisCameraController - - - - - - CameraOutput0 - - - Item2 - Item1 - - - thisCameraController - - - - - - - - - - - - - - - - - - - RigSchema - - - TriggeredCameraController1 - - - - CameraOutput1 - - - - Source1 - - - thisCameraController - - - thisCameraController - - - - - - CameraOutput1 - - - Item2 - Item1 - - - thisCameraController - - - - - - - - - - - - - - - - - - - - - - - - - TriggeredCamerasStreams - - - - ControllersInitialized - - - StartCameras - None - - - - 1 - - - - - - - Source1 - - - Accumulation,Value - - - - - - - it - - - StartCameras - CameraOutput0 CameraOutput1 - - - - - - - - - - - - - - - - - CameraControllersActive - - - CameraControllersActive - - - Write - - - - HarpBehaviorCommands - - - StartExperiment - - - - PT1S - - - - - - - CameraControllersActive - - - Write - - - - HarpBehaviorCommands - - - EndExperiment - - - - PT1S - - - - + + Source1 + - - - - - - - - - - - - - - - - - - - - - - - - - + - HarpBehaviorEvents - - - + StartExperiment - - Seconds + + - - HarpTimestampSource + + + + + + + + + + + - - - false - - - - - 1 - - - - SaveRawVideo - - - ControllersInitialized - - - - - - RigSchema - - - ExpectedControllers - (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) - - - - - - - - - - Source1 - - - - - - - - - - StartExperiment - - - - - - - SubjectSchema @@ -1253,42 +830,11 @@ Modality - RigSchema - - - TriggeredCameraController0 - - - TriggeredCamerasStream0 - - - RigSchema - - - TriggeredCameraController0 - - - - - - - RigSchema - - - TriggeredCameraController1 - - - TriggeredCamerasStream1 - - - RigSchema - - - TriggeredCameraController1 + TriggeredCamerasStreams - + - + @@ -1298,16 +844,6 @@ - - - - - - - - - - @@ -1332,6 +868,11 @@ + + + 0 + + JustFrames @@ -1377,31 +918,22 @@ - + - - - - - - - - + + + + + + + + - + - - - - - - - - - - + \ No newline at end of file From 1d31a089990ef9db774382c047cdc5014f1d45fd Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 12 Nov 2025 10:01:52 -0800 Subject: [PATCH 16/32] Working in progress --- .../aind_behavior_just_frames.json | 245 +- .../aind_physiology_fip_message_protocol.json | 1263 ++++++ src/Extensions.csproj | 3 +- .../AindBehaviorJustFrames.Generated.cs | 689 ++-- ...dPhysiologyFipMessageProtocol.Generated.cs | 3532 +++++++++++++++++ src/Extensions/BuildRegisteredMessage.cs | 51 + src/Extensions/CameraQc.bonsai | 120 +- src/Extensions/HarpDevices.bonsai | 474 ++- src/Extensions/Logging.bonsai | 635 +++ src/Extensions/Main.bonsai | 1217 ++++++ src/Extensions/TryParseRegisteredMessage.cs | 32 + src/Extensions/Visualizers.bonsai | 22 +- .../message_protocol.py | 45 + src/aind_behavior_just_frames/regenerate.py | 12 + src/aind_behavior_just_frames/rig.py | 34 +- src/main.bonsai | 906 +---- src/satellite.bonsai | 85 + 17 files changed, 8020 insertions(+), 1345 deletions(-) create mode 100644 src/DataSchemas/aind_physiology_fip_message_protocol.json create mode 100644 src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs create mode 100644 src/Extensions/BuildRegisteredMessage.cs create mode 100644 src/Extensions/Logging.bonsai create mode 100644 src/Extensions/Main.bonsai create mode 100644 src/Extensions/TryParseRegisteredMessage.cs create mode 100644 src/aind_behavior_just_frames/message_protocol.py create mode 100644 src/satellite.bonsai diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index 785f362..e783611 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -170,22 +170,29 @@ "$ref": "#/$defs/HarpBehavior", "description": "Harp behavior board. Will be the source of triggers for the two camera controllers." }, - "harp_white_rabbit": { - "default": null, - "description": "Harp White Rabbit for time synchronization.", - "oneOf": [ - { - "$ref": "#/$defs/HarpWhiteRabbit" - }, - { - "type": "null" - } - ] + "satellite_rigs": { + "description": "List of satellite rigs.", + "items": { + "$ref": "#/$defs/SatelliteRig" + }, + "minItems": 1, + "title": "Satellite Rigs", + "type": "array" + }, + "is_satellite": { + "default": false, + "title": "Is Satellite", + "type": "boolean" + }, + "zmq_connection": { + "$ref": "#/$defs/ZmqPubSub", + "description": "ZMQ connection for communication." } }, "required": [ "rig_name", - "harp_behavior" + "harp_behavior", + "zmq_connection" ], "title": "AindJustFramesRig", "type": "object" @@ -269,34 +276,6 @@ "title": "CameraController[SpinnakerCamera]", "type": "object" }, - "ConnectedClockOutput": { - "properties": { - "target_device": { - "default": null, - "description": "Optional device name to provide user additional information", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Target Device" - }, - "output_channel": { - "description": "Output channel", - "minimum": 0, - "title": "Output Channel", - "type": "integer" - } - }, - "required": [ - "output_channel" - ], - "title": "ConnectedClockOutput", - "type": "object" - }, "HarpBehavior": { "properties": { "device_type": { @@ -373,91 +352,6 @@ "title": "HarpBehavior", "type": "object" }, - "HarpWhiteRabbit": { - "properties": { - "device_type": { - "const": "WhiteRabbit", - "default": "WhiteRabbit", - "title": "Device Type", - "type": "string" - }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "calibration": { - "default": null, - "description": "Calibration", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "who_am_i": { - "const": 1404, - "default": 1404, - "title": "Who Am I", - "type": "integer" - }, - "serial_number": { - "default": null, - "description": "Device serial number", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Serial Number" - }, - "port_name": { - "description": "Device port name", - "title": "Port Name", - "type": "string" - }, - "connected_clock_outputs": { - "default": [], - "description": "Connected clock outputs", - "items": { - "$ref": "#/$defs/ConnectedClockOutput" - }, - "title": "Connected Clock Outputs", - "type": "array" - } - }, - "required": [ - "port_name" - ], - "title": "HarpWhiteRabbit", - "type": "object" - }, "Rect": { "properties": { "x": { @@ -492,6 +386,72 @@ "title": "Rect", "type": "object" }, + "SatelliteRig": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.12.3", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.5.0-rc0", + "default": "0.5.0-rc0", + "title": "Version", + "type": "string" + }, + "computer_name": { + "description": "Remote Computer name", + "title": "Computer Name", + "type": "string" + }, + "rig_name": { + "description": "Rig name", + "title": "Rig Name", + "type": "string" + }, + "zmq_connection": { + "$ref": "#/$defs/ZmqPubSub", + "description": "ZMQ connection for communication." + }, + "triggered_camera_controller_0": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "triggered_camera_controller_1": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera1 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "is_satellite": { + "default": true, + "title": "Is Satellite", + "type": "boolean" + } + }, + "required": [ + "computer_name", + "rig_name", + "zmq_connection" + ], + "title": "SatelliteRig", + "type": "object" + }, "SpinnakerCamera": { "properties": { "device_type": { @@ -1035,6 +995,41 @@ }, "title": "VideoWriterOpenCv", "type": "object" + }, + "ZmqConnection": { + "properties": { + "connection_string": { + "default": "@tcp://localhost:5556", + "description": "The connection string for the ZMQ socket.", + "title": "Connection String", + "type": "string" + }, + "topic": { + "default": "", + "title": "Topic", + "type": "string" + } + }, + "title": "ZmqConnection", + "type": "object" + }, + "ZmqPubSub": { + "properties": { + "pub": { + "$ref": "#/$defs/ZmqConnection", + "description": "ZMQ Publisher" + }, + "sub": { + "$ref": "#/$defs/ZmqConnection", + "description": "ZMQ Subscriber" + } + }, + "required": [ + "pub", + "sub" + ], + "title": "ZmqPubSub", + "type": "object" } } } \ No newline at end of file diff --git a/src/DataSchemas/aind_physiology_fip_message_protocol.json b/src/DataSchemas/aind_physiology_fip_message_protocol.json new file mode 100644 index 0000000..c2009cf --- /dev/null +++ b/src/DataSchemas/aind_physiology_fip_message_protocol.json @@ -0,0 +1,1263 @@ +{ + "$defs": { + "AindBehaviorSessionModel": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.12.3", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.12.3", + "default": "0.12.3", + "title": "Version", + "type": "string" + }, + "experiment": { + "default": null, + "description": "Name of the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Experiment" + }, + "experimenter": { + "default": [], + "description": "Name of the experimenter", + "items": { + "type": "string" + }, + "title": "Experimenter", + "type": "array" + }, + "date": { + "description": "Date of the experiment", + "format": "date-time", + "title": "Date", + "type": "string" + }, + "root_path": { + "description": "Root path where data will be logged", + "title": "Root Path", + "type": "string" + }, + "session_name": { + "default": null, + "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Name" + }, + "subject": { + "description": "Name of the subject", + "title": "Subject", + "type": "string" + }, + "experiment_version": { + "default": "", + "deprecated": true, + "description": "Version of the experiment", + "title": "Experiment Version", + "type": "string" + }, + "notes": { + "default": null, + "description": "Notes about the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Notes" + }, + "commit_hash": { + "default": null, + "description": "Commit hash of the repository", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Hash" + }, + "allow_dirty_repo": { + "default": false, + "description": "Allow running from a dirty repository", + "title": "Allow Dirty Repo", + "type": "boolean" + }, + "skip_hardware_validation": { + "default": false, + "description": "Skip hardware validation", + "title": "Skip Hardware Validation", + "type": "boolean" + } + }, + "required": [ + "root_path", + "subject" + ], + "title": "AindBehaviorSessionModel", + "type": "object" + }, + "BaseModel": { + "properties": {}, + "title": "BaseModel", + "type": "object" + }, + "CameraController_SpinnakerCamera_": { + "properties": { + "device_type": { + "const": "CameraController", + "default": "CameraController", + "title": "Device Type", + "type": "string" + }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, + "additional_settings": { + "default": null, + "description": "Additional settings", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "calibration": { + "default": null, + "description": "Calibration", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "cameras": { + "additionalProperties": { + "$ref": "#/$defs/SpinnakerCamera" + }, + "description": "Cameras to be instantiated", + "title": "Cameras", + "type": "object" + }, + "frame_rate": { + "default": 30, + "description": "Frame rate of the trigger to all cameras", + "oneOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Frame Rate" + } + }, + "required": [ + "cameras" + ], + "title": "CameraController[SpinnakerCamera]", + "type": "object" + }, + "HeartbeatPayload": { + "description": "Payload for heartbeat messages indicating system health status.\n\nHeartbeat messages are used to monitor the health and availability\nof system components. They include a status indicator and optional\ncontext information.\n\nAttributes:\n context: Optional additional data about the system state\n status: Current health status of the component\n\nExamples:\n ```python\n heartbeat = HeartbeatPayload(\n status=HeartbeatStatus.OK,\n context={\"cpu_usage\": 0.25, \"memory_usage\": 0.60}\n )\n print(heartbeat.status) # HeartbeatStatus.OK\n\n warning_heartbeat = HeartbeatPayload(\n status=HeartbeatStatus.WARNING,\n context={\"disk_space_low\": True}\n )\n ```", + "properties": { + "payload_type": { + "const": "HeartbeatPayload", + "default": "HeartbeatPayload", + "title": "Payload Type", + "type": "string" + }, + "context": { + "default": null, + "description": "Additional context for the heartbeat message.", + "oneOf": [ + {}, + { + "type": "null" + } + ], + "title": "Context" + }, + "status": { + "$ref": "#/$defs/HeartbeatStatus", + "description": "The status of the heartbeat message" + } + }, + "required": [ + "status" + ], + "title": "HeartbeatPayload", + "type": "object" + }, + "HeartbeatStatus": { + "description": "Enumeration of possible heartbeat status values.\n\nRepresents the health status of a system component,\nwith higher values indicating more severe issues.\n\nExamples:\n ```python\n HeartbeatStatus.OK # \n HeartbeatStatus.CRITICAL > HeartbeatStatus.WARNING # True\n int(HeartbeatStatus.ERROR) # 2\n ```", + "enum": [ + 0, + 1, + 2, + 3 + ], + "title": "HeartbeatStatus", + "type": "integer", + "x-enumNames": [ + "Ok", + "Warning", + "Error", + "Critical" + ] + }, + "LogLevel": { + "description": "Enumeration of log levels for the logging system.\n\nFollows standard Python logging levels with integer values\nthat allow for easy comparison and filtering.\n\nExamples:\n ```python\n LogLevel.ERROR > LogLevel.WARNING # True\n LogLevel.DEBUG.value # 10\n str(LogLevel.INFO) # 'LogLevel.INFO'\n ```", + "enum": [ + 50, + 40, + 30, + 20, + 10, + 0 + ], + "title": "LogLevel", + "type": "integer", + "x-enumNames": [ + "Critical", + "Error", + "Warning", + "Info", + "Debug", + "Notset" + ] + }, + "LogPayload": { + "description": "Payload for log messages containing logging information.\n\nThis payload carries log data including the message content,\nseverity level, optional context, and application version.\n\nAttributes:\n message: The actual log message text\n level: Severity level of the log entry\n context: Optional additional data related to the log\n application_version: Version of the application generating the log\n\nExamples:\n ```python\n log_payload = LogPayload(\n message=\"System startup complete\",\n level=LogLevel.INFO,\n context={\"operator\": \"John Doe\"},\n application_version=\"1.0.0\"\n )\n print(log_payload.level) # LogLevel.INFO\n ```", + "properties": { + "payload_type": { + "const": "LogPayload", + "default": "LogPayload", + "title": "Payload Type", + "type": "string" + }, + "message": { + "description": "The message of the log", + "title": "Message", + "type": "string" + }, + "level": { + "$ref": "#/$defs/LogLevel", + "default": 10, + "description": "The level of the log message" + }, + "context": { + "default": null, + "description": "Additional context for the log message", + "oneOf": [ + {}, + { + "type": "null" + } + ], + "title": "Context" + }, + "application_version": { + "default": null, + "description": "The version of the application", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Application Version" + } + }, + "required": [ + "message" + ], + "title": "LogPayload", + "type": "object" + }, + "Message": { + "$ref": "#/$defs/_Message_Any_", + "title": "Message" + }, + "MessageType": { + "description": "Enumeration of possible message types in the protocol.\n\nExamples:\n ```python\n MessageType.REQUEST # 'request'\n MessageType.REPLY # 'reply'\n MessageType.EVENT # 'event'\n ```", + "enum": [ + "request", + "reply", + "event" + ], + "title": "MessageType", + "type": "string" + }, + "Rect": { + "properties": { + "x": { + "default": 0, + "description": "X coordinate of the top-left corner", + "minimum": 0, + "title": "X", + "type": "integer" + }, + "y": { + "default": 0, + "description": "Y coordinate of the top-left corner", + "minimum": 0, + "title": "Y", + "type": "integer" + }, + "width": { + "default": 0, + "description": "Width of the rectangle", + "minimum": 0, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 0, + "description": "Height of the rectangle", + "minimum": 0, + "title": "Height", + "type": "integer" + } + }, + "title": "Rect", + "type": "object" + }, + "RegisteredMessages": { + "properties": { + "message_type": { + "$ref": "#/$defs/MessageType" + }, + "protocol_version": { + "const": 0, + "default": 0, + "title": "Protocol Version", + "type": "integer" + }, + "timestamp": { + "description": "The timestamp of the message", + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Timestamp" + }, + "payload": { + "$ref": "#/$defs/RegisteredPayload", + "description": "The payload of the message" + }, + "process_id": { + "description": "Process that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Process Id" + }, + "hostname": { + "description": "Hostname that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Hostname" + }, + "rig_name": { + "description": "Rig name that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Rig Name" + } + }, + "required": [ + "message_type", + "timestamp", + "payload", + "process_id", + "hostname", + "rig_name" + ], + "title": "RegisteredMessages", + "type": "object" + }, + "RegisteredPayload": { + "discriminator": { + "mapping": { + "HeartbeatPayload": "#/$defs/HeartbeatPayload", + "LogPayload": "#/$defs/LogPayload", + "SatelliteRig": "#/$defs/SatelliteRigPayload", + "SatelliteSession": "#/$defs/SatelliteSessionPayload", + "Start": "#/$defs/StartPayload", + "Stop": "#/$defs/StopPayload" + }, + "propertyName": "payload_type" + }, + "oneOf": [ + { + "$ref": "#/$defs/StartPayload" + }, + { + "$ref": "#/$defs/StopPayload" + }, + { + "$ref": "#/$defs/SatelliteRigPayload" + }, + { + "$ref": "#/$defs/SatelliteSessionPayload" + }, + { + "$ref": "#/$defs/LogPayload" + }, + { + "$ref": "#/$defs/HeartbeatPayload" + } + ], + "title": "RegisteredPayload", + "x-abstract": true + }, + "SatelliteRig": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.12.3", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.5.0-rc0", + "default": "0.5.0-rc0", + "title": "Version", + "type": "string" + }, + "computer_name": { + "description": "Remote Computer name", + "title": "Computer Name", + "type": "string" + }, + "rig_name": { + "description": "Rig name", + "title": "Rig Name", + "type": "string" + }, + "zmq_connection": { + "$ref": "#/$defs/ZmqPubSub", + "description": "ZMQ connection for communication." + }, + "triggered_camera_controller_0": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "triggered_camera_controller_1": { + "default": null, + "description": "Camera controller to triggered cameras. Will use Camera1 register as a trigger.", + "oneOf": [ + { + "$ref": "#/$defs/CameraController_SpinnakerCamera_" + }, + { + "type": "null" + } + ] + }, + "is_satellite": { + "default": true, + "title": "Is Satellite", + "type": "boolean" + } + }, + "required": [ + "computer_name", + "rig_name", + "zmq_connection" + ], + "title": "SatelliteRig", + "type": "object" + }, + "SatelliteRigPayload": { + "properties": { + "payload_type": { + "const": "SatelliteRig", + "default": "SatelliteRig", + "title": "Payload Type", + "type": "string" + }, + "rig": { + "$ref": "#/$defs/SatelliteRig", + "description": "Satellite Rig configuration." + } + }, + "required": [ + "rig" + ], + "title": "SatelliteRigPayload", + "type": "object" + }, + "SatelliteSessionPayload": { + "properties": { + "payload_type": { + "const": "SatelliteSession", + "default": "SatelliteSession", + "title": "Payload Type", + "type": "string" + }, + "session": { + "$ref": "#/$defs/AindBehaviorSessionModel", + "description": "Satellite session configuration." + } + }, + "required": [ + "session" + ], + "title": "SatelliteSessionPayload", + "type": "object" + }, + "SpinnakerCamera": { + "properties": { + "device_type": { + "const": "SpinnakerCamera", + "default": "SpinnakerCamera", + "description": "Device type", + "title": "Device Type", + "type": "string" + }, + "device_name": { + "default": null, + "description": "Device name", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Device Name" + }, + "additional_settings": { + "default": null, + "description": "Additional settings", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "calibration": { + "default": null, + "description": "Calibration", + "oneOf": [ + { + "$ref": "#/$defs/BaseModel" + }, + { + "type": "null" + } + ] + }, + "serial_number": { + "description": "Camera serial number", + "title": "Serial Number", + "type": "string" + }, + "binning": { + "default": 1, + "description": "Binning", + "minimum": 1, + "title": "Binning", + "type": "integer" + }, + "color_processing": { + "default": "Default", + "description": "Color processing", + "enum": [ + "Default", + "NoColorProcessing" + ], + "title": "Color Processing", + "type": "string" + }, + "exposure": { + "default": 1000, + "description": "Exposure time", + "minimum": 100, + "title": "Exposure", + "type": "integer" + }, + "gain": { + "default": 0, + "description": "Gain", + "minimum": 0, + "title": "Gain", + "type": "number" + }, + "gamma": { + "default": null, + "description": "Gamma. If None, will disable gamma correction.", + "oneOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Gamma" + }, + "adc_bit_depth": { + "default": 0, + "description": "ADC bit depth. If None will be left as default.", + "oneOf": [ + { + "$ref": "#/$defs/SpinnakerCameraAdcBitDepth" + }, + { + "type": "null" + } + ] + }, + "pixel_format": { + "default": 0, + "description": "Pixel format. If None will be left as default.", + "oneOf": [ + { + "$ref": "#/$defs/SpinnakerCameraPixelFormat" + }, + { + "type": "null" + } + ] + }, + "region_of_interest": { + "$ref": "#/$defs/Rect", + "default": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "description": "Region of interest" + }, + "video_writer": { + "default": null, + "description": "Video writer. If not provided, no video will be saved.", + "oneOf": [ + { + "$ref": "#/$defs/VideoWriter" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "serial_number" + ], + "title": "SpinnakerCamera", + "type": "object" + }, + "SpinnakerCameraAdcBitDepth": { + "enum": [ + 0, + 1, + 2 + ], + "title": "SpinnakerCameraAdcBitDepth", + "type": "integer", + "x-enumNames": [ + "Adc8bit", + "Adc10bit", + "Adc12bit" + ] + }, + "SpinnakerCameraPixelFormat": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143 + ], + "title": "SpinnakerCameraPixelFormat", + "type": "integer", + "x-enumNames": [ + "Mono8", + "Mono16", + "Rgb8packed", + "Bayergr8", + "Bayerrg8", + "Bayergb8", + "Bayerbg8", + "Bayergr16", + "Bayerrg16", + "Bayergb16", + "Bayerbg16", + "Mono12packed", + "Bayergr12packed", + "Bayerrg12packed", + "Bayergb12packed", + "Bayerbg12packed", + "Yuv411packed", + "Yuv422packed", + "Yuv444packed", + "Mono12p", + "Bayergr12p", + "Bayerrg12p", + "Bayergb12p", + "Bayerbg12p", + "Ycbcr8", + "Ycbcr4228", + "Ycbcr4118", + "Bgr8", + "Bgra8", + "Mono10packed", + "Bayergr10packed", + "Bayerrg10packed", + "Bayergb10packed", + "Bayerbg10packed", + "Mono10p", + "Bayergr10p", + "Bayerrg10p", + "Bayergb10p", + "Bayerbg10p", + "Mono1p", + "Mono2p", + "Mono4p", + "Mono8s", + "Mono10", + "Mono12", + "Mono14", + "Mono16s", + "Mono32f", + "Bayerbg10", + "Bayerbg12", + "Bayergb10", + "Bayergb12", + "Bayergr10", + "Bayergr12", + "Bayerrg10", + "Bayerrg12", + "Rgba8", + "Rgba10", + "Rgba10p", + "Rgba12", + "Rgba12p", + "Rgba14", + "Rgba16", + "Rgb8", + "Rgb8Planar", + "Rgb10", + "Rgb10Planar", + "Rgb10p", + "Rgb10p32", + "Rgb12", + "Rgb12Planar", + "Rgb12p", + "Rgb14", + "Rgb16", + "Rgb16s", + "Rgb32f", + "Rgb16Planar", + "Rgb565p", + "Bgra10", + "Bgra10p", + "Bgra12", + "Bgra12p", + "Bgra14", + "Bgra16", + "Rgba32f", + "Bgr10", + "Bgr10p", + "Bgr12", + "Bgr12p", + "Bgr14", + "Bgr16", + "Bgr565p", + "R8", + "R10", + "R12", + "R16", + "G8", + "G10", + "G12", + "G16", + "B8", + "B10", + "B12", + "B16", + "Coord3dAbc8", + "Coord3dAbc8Planar", + "Coord3dAbc10p", + "Coord3dAbc10pPlanar", + "Coord3dAbc12p", + "Coord3dAbc12pPlanar", + "Coord3dAbc16", + "Coord3dAbc16Planar", + "Coord3dAbc32f", + "Coord3dAbc32fPlanar", + "Coord3dAc8", + "Coord3dAc8Planar", + "Coord3dAc10p", + "Coord3dAc10pPlanar", + "Coord3dAc12p", + "Coord3dAc12pPlanar", + "Coord3dAc16", + "Coord3dAc16Planar", + "Coord3dAc32f", + "Coord3dAc32fPlanar", + "Coord3dA8", + "Coord3dA10p", + "Coord3dA12p", + "Coord3dA16", + "Coord3dA32f", + "Coord3dB8", + "Coord3dB10p", + "Coord3dB12p", + "Coord3dB16", + "Coord3dB32f", + "Coord3dC8", + "Coord3dC10p", + "Coord3dC12p", + "Coord3dC16", + "Coord3dC32f", + "Confidence1", + "Confidence1p", + "Confidence8", + "Confidence16", + "Confidence32f" + ] + }, + "StartPayload": { + "properties": { + "payload_type": { + "const": "Start", + "default": "Start", + "title": "Payload Type", + "type": "string" + } + }, + "title": "StartPayload", + "type": "object" + }, + "StopPayload": { + "properties": { + "payload_type": { + "const": "Stop", + "default": "Stop", + "title": "Payload Type", + "type": "string" + } + }, + "title": "StopPayload", + "type": "object" + }, + "VideoWriter": { + "discriminator": { + "mapping": { + "FFMPEG": "#/$defs/VideoWriterFfmpeg", + "OPENCV": "#/$defs/VideoWriterOpenCv" + }, + "propertyName": "video_writer_type" + }, + "oneOf": [ + { + "$ref": "#/$defs/VideoWriterFfmpeg" + }, + { + "$ref": "#/$defs/VideoWriterOpenCv" + } + ] + }, + "VideoWriterFfmpeg": { + "properties": { + "video_writer_type": { + "const": "FFMPEG", + "default": "FFMPEG", + "title": "Video Writer Type", + "type": "string" + }, + "frame_rate": { + "default": 30, + "description": "Encoding frame rate", + "minimum": 0, + "title": "Frame Rate", + "type": "integer" + }, + "container_extension": { + "default": "mp4", + "description": "Container extension", + "title": "Container Extension", + "type": "string" + }, + "output_arguments": { + "default": "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M", + "description": "Output arguments", + "title": "Output Arguments", + "type": "string" + }, + "input_arguments": { + "default": "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear", + "description": "Input arguments", + "title": "Input Arguments", + "type": "string" + } + }, + "title": "VideoWriterFfmpeg", + "type": "object" + }, + "VideoWriterOpenCv": { + "properties": { + "video_writer_type": { + "const": "OPENCV", + "default": "OPENCV", + "title": "Video Writer Type", + "type": "string" + }, + "frame_rate": { + "default": 30, + "description": "Encoding frame rate", + "minimum": 0, + "title": "Frame Rate", + "type": "integer" + }, + "container_extension": { + "default": "avi", + "description": "Container extension", + "title": "Container Extension", + "type": "string" + }, + "four_cc": { + "default": "FMP4", + "description": "Four character code", + "title": "Four Cc", + "type": "string" + } + }, + "title": "VideoWriterOpenCv", + "type": "object" + }, + "ZmqConnection": { + "properties": { + "connection_string": { + "default": "@tcp://localhost:5556", + "description": "The connection string for the ZMQ socket.", + "title": "Connection String", + "type": "string" + }, + "topic": { + "default": "", + "title": "Topic", + "type": "string" + } + }, + "title": "ZmqConnection", + "type": "object" + }, + "ZmqPubSub": { + "properties": { + "pub": { + "$ref": "#/$defs/ZmqConnection", + "description": "ZMQ Publisher" + }, + "sub": { + "$ref": "#/$defs/ZmqConnection", + "description": "ZMQ Subscriber" + } + }, + "required": [ + "pub", + "sub" + ], + "title": "ZmqPubSub", + "type": "object" + }, + "_Message_Any_": { + "properties": { + "message_type": { + "$ref": "#/$defs/MessageType" + }, + "protocol_version": { + "const": 0, + "default": 0, + "title": "Protocol Version", + "type": "integer" + }, + "timestamp": { + "description": "The timestamp of the message", + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Timestamp" + }, + "payload": { + "description": "The payload of the message", + "title": "Payload" + }, + "process_id": { + "description": "Process that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Process Id" + }, + "hostname": { + "description": "Hostname that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Hostname" + }, + "rig_name": { + "description": "Rig name that created the message", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Rig Name" + } + }, + "required": [ + "message_type", + "timestamp", + "payload", + "process_id", + "hostname", + "rig_name" + ], + "title": "_Message[Any]", + "type": "object" + } + }, + "x-abstract": true +} \ No newline at end of file diff --git a/src/Extensions.csproj b/src/Extensions.csproj index 113a14b..4a83169 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -6,10 +6,11 @@ - + + \ No newline at end of file diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index 38d9208..22bb3b9 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -347,13 +347,20 @@ public partial class AindJustFramesRig private HarpBehavior _harpBehavior; - private HarpWhiteRabbit _harpWhiteRabbit; + private System.Collections.Generic.List _satelliteRigs; + + private bool _isSatellite; + + private ZmqPubSub _zmqConnection; public AindJustFramesRig() { _aindBehaviorServicesPkgVersion = "0.12.3"; _version = "0.5.0-rc0"; _harpBehavior = new HarpBehavior(); + _satelliteRigs = new System.Collections.Generic.List(); + _isSatellite = false; + _zmqConnection = new ZmqPubSub(); } protected AindJustFramesRig(AindJustFramesRig other) @@ -365,7 +372,9 @@ protected AindJustFramesRig(AindJustFramesRig other) _triggeredCameraController0 = other._triggeredCameraController0; _triggeredCameraController1 = other._triggeredCameraController1; _harpBehavior = other._harpBehavior; - _harpWhiteRabbit = other._harpWhiteRabbit; + _satelliteRigs = other._satelliteRigs; + _isSatellite = other._isSatellite; + _zmqConnection = other._zmqConnection; } [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] @@ -484,20 +493,51 @@ public HarpBehavior HarpBehavior } /// - /// Harp White Rabbit for time synchronization. + /// List of satellite rigs. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("satellite_rigs")] + [System.ComponentModel.DescriptionAttribute("List of satellite rigs.")] + public System.Collections.Generic.List SatelliteRigs + { + get + { + return _satelliteRigs; + } + set + { + _satelliteRigs = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("is_satellite")] + public bool IsSatellite + { + get + { + return _isSatellite; + } + set + { + _isSatellite = value; + } + } + + /// + /// ZMQ connection for communication. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_white_rabbit")] - [System.ComponentModel.DescriptionAttribute("Harp White Rabbit for time synchronization.")] - public HarpWhiteRabbit HarpWhiteRabbit + [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] + public ZmqPubSub ZmqConnection { get { - return _harpWhiteRabbit; + return _zmqConnection; } set { - _harpWhiteRabbit = value; + _zmqConnection = value; } } @@ -520,7 +560,9 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); - stringBuilder.Append("HarpWhiteRabbit = " + _harpWhiteRabbit); + stringBuilder.Append("SatelliteRigs = " + _satelliteRigs + ", "); + stringBuilder.Append("IsSatellite = " + _isSatellite + ", "); + stringBuilder.Append("ZmqConnection = " + _zmqConnection); return true; } @@ -755,92 +797,6 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ConnectedClockOutput - { - - private string _targetDevice; - - private int _outputChannel; - - public ConnectedClockOutput() - { - } - - protected ConnectedClockOutput(ConnectedClockOutput other) - { - _targetDevice = other._targetDevice; - _outputChannel = other._outputChannel; - } - - /// - /// Optional device name to provide user additional information - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_device")] - [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] - public string TargetDevice - { - get - { - return _targetDevice; - } - set - { - _targetDevice = value; - } - } - - /// - /// Output channel - /// - [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Output channel")] - public int OutputChannel - { - get - { - return _outputChannel; - } - set - { - _outputChannel = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); - stringBuilder.Append("OutputChannel = " + _outputChannel); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] @@ -1031,195 +987,117 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpWhiteRabbit + public partial class Rect { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - private System.Collections.Generic.List _connectedClockOutputs; + private int _x; - public HarpWhiteRabbit() - { - _deviceType = "WhiteRabbit"; - _whoAmI = 1404; - _connectedClockOutputs = new System.Collections.Generic.List(); - } + private int _y; - protected HarpWhiteRabbit(HarpWhiteRabbit other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - _connectedClockOutputs = other._connectedClockOutputs; - } + private int _width; - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } + private int _height; - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + public Rect() { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } + _x = 0; + _y = 0; + _width = 0; + _height = 0; } - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + protected Rect(Rect other) { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } + _x = other._x; + _y = other._y; + _width = other._width; + _height = other._height; } /// - /// Calibration + /// X coordinate of the top-left corner /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] + public int X { get { - return _whoAmI; + return _x; } set { - _whoAmI = value; + _x = value; } } /// - /// Device serial number + /// Y coordinate of the top-left corner /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] + public int Y { get { - return _serialNumber; + return _y; } set { - _serialNumber = value; + _y = value; } } /// - /// Device port name + /// Width of the rectangle /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] + public int Width { get { - return _portName; + return _width; } set { - _portName = value; + _width = value; } } /// - /// Connected clock outputs + /// Height of the rectangle /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] - [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] - public System.Collections.Generic.List ConnectedClockOutputs + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] + public int Height { get { - return _connectedClockOutputs; + return _height; } set { - _connectedClockOutputs = value; + _height = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName + ", "); - stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); return true; } @@ -1241,117 +1119,192 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rect + public partial class SatelliteRig { - private int _x; + private string _aindBehaviorServicesPkgVersion; - private int _y; + private string _version; - private int _width; + private string _computerName; - private int _height; + private string _rigName; - public Rect() + private ZmqPubSub _zmqConnection; + + private CameraControllerSpinnakerCamera _triggeredCameraController0; + + private CameraControllerSpinnakerCamera _triggeredCameraController1; + + private bool _isSatellite; + + public SatelliteRig() { - _x = 0; - _y = 0; - _width = 0; - _height = 0; + _aindBehaviorServicesPkgVersion = "0.12.3"; + _version = "0.5.0-rc0"; + _zmqConnection = new ZmqPubSub(); + _isSatellite = true; } - protected Rect(Rect other) + protected SatelliteRig(SatelliteRig other) { - _x = other._x; - _y = other._y; - _width = other._width; - _height = other._height; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _computerName = other._computerName; + _rigName = other._rigName; + _zmqConnection = other._zmqConnection; + _triggeredCameraController0 = other._triggeredCameraController0; + _triggeredCameraController1 = other._triggeredCameraController1; + _isSatellite = other._isSatellite; + } + + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; + } } /// - /// X coordinate of the top-left corner + /// Remote Computer name /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] - public int X + [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Remote Computer name")] + public string ComputerName { get { - return _x; + return _computerName; } set { - _x = value; + _computerName = value; } } /// - /// Y coordinate of the top-left corner + /// Rig name /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] - public int Y + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rig name")] + public string RigName { get { - return _y; + return _rigName; } set { - _y = value; + _rigName = value; } } /// - /// Width of the rectangle + /// ZMQ connection for communication. /// - [Newtonsoft.Json.JsonPropertyAttribute("width")] - [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] - public int Width + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] + public ZmqPubSub ZmqConnection { get { - return _width; + return _zmqConnection; } set { - _width = value; + _zmqConnection = value; } } /// - /// Height of the rectangle + /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. /// - [Newtonsoft.Json.JsonPropertyAttribute("height")] - [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] - public int Height + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_0")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera0 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController0 { get { - return _height; + return _triggeredCameraController0; } set { - _height = value; + _triggeredCameraController0 = value; } } - public System.IObservable Generate() + /// + /// Camera controller to triggered cameras. Will use Camera1 register as a trigger. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_1")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera1 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController1 { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); + get + { + return _triggeredCameraController1; + } + set + { + _triggeredCameraController1 = value; + } } - public System.IObservable Generate(System.IObservable source) + [Newtonsoft.Json.JsonPropertyAttribute("is_satellite")] + public bool IsSatellite { - return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); + get + { + return _isSatellite; + } + set + { + _isSatellite = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteRig(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteRig(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Width = " + _width + ", "); - stringBuilder.Append("Height = " + _height); + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("ComputerName = " + _computerName + ", "); + stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("ZmqConnection = " + _zmqConnection + ", "); + stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); + stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); + stringBuilder.Append("IsSatellite = " + _isSatellite); return true; } @@ -2450,6 +2403,180 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ZmqConnection + { + + private string _connectionString; + + private string _topic; + + public ZmqConnection() + { + _connectionString = "@tcp://localhost:5556"; + _topic = ""; + } + + protected ZmqConnection(ZmqConnection other) + { + _connectionString = other._connectionString; + _topic = other._topic; + } + + /// + /// The connection string for the ZMQ socket. + /// + [Newtonsoft.Json.JsonPropertyAttribute("connection_string")] + [System.ComponentModel.DescriptionAttribute("The connection string for the ZMQ socket.")] + public string ConnectionString + { + get + { + return _connectionString; + } + set + { + _connectionString = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("topic")] + public string Topic + { + get + { + return _topic; + } + set + { + _topic = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqConnection(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ZmqConnection(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("ConnectionString = " + _connectionString + ", "); + stringBuilder.Append("Topic = " + _topic); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ZmqPubSub + { + + private ZmqConnection _pub; + + private ZmqConnection _sub; + + public ZmqPubSub() + { + _pub = new ZmqConnection(); + _sub = new ZmqConnection(); + } + + protected ZmqPubSub(ZmqPubSub other) + { + _pub = other._pub; + _sub = other._sub; + } + + /// + /// ZMQ Publisher + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("pub", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ Publisher")] + public ZmqConnection Pub + { + get + { + return _pub; + } + set + { + _pub = value; + } + } + + /// + /// ZMQ Subscriber + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("sub", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ Subscriber")] + public ZmqConnection Sub + { + get + { + return _sub; + } + set + { + _sub = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqPubSub(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ZmqPubSub(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Pub = " + _pub + ", "); + stringBuilder.Append("Sub = " + _sub); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum SpinnakerCameraColorProcessing @@ -2679,24 +2806,19 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -2718,6 +2840,16 @@ public System.IObservable Process(System.IObservable { return Process(source); } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } } @@ -2732,14 +2864,15 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { diff --git a/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs b/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs new file mode 100644 index 0000000..fae3503 --- /dev/null +++ b/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs @@ -0,0 +1,3532 @@ +//---------------------- +// +// Generated using the NJsonSchema v10.9.0.0 (Newtonsoft.Json v13.0.0.0) (http://NJsonSchema.org) +// +//---------------------- + + +namespace AindJustFramesSchemas.MessageProtocol +{ + #pragma warning disable // Disable all warnings + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindBehaviorSessionModel + { + + private string _aindBehaviorServicesPkgVersion; + + private string _version; + + private string _experiment; + + private System.Collections.Generic.List _experimenter; + + private System.DateTimeOffset _date; + + private string _rootPath; + + private string _sessionName; + + private string _subject; + + private string _experimentVersion; + + private string _notes; + + private string _commitHash; + + private bool _allowDirtyRepo; + + private bool _skipHardwareValidation; + + public AindBehaviorSessionModel() + { + _aindBehaviorServicesPkgVersion = "0.12.3"; + _version = "0.12.3"; + _experimenter = new System.Collections.Generic.List(); + _experimentVersion = ""; + _allowDirtyRepo = false; + _skipHardwareValidation = false; + } + + protected AindBehaviorSessionModel(AindBehaviorSessionModel other) + { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _experiment = other._experiment; + _experimenter = other._experimenter; + _date = other._date; + _rootPath = other._rootPath; + _sessionName = other._sessionName; + _subject = other._subject; + _experimentVersion = other._experimentVersion; + _notes = other._notes; + _commitHash = other._commitHash; + _allowDirtyRepo = other._allowDirtyRepo; + _skipHardwareValidation = other._skipHardwareValidation; + } + + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; + } + } + + /// + /// Name of the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("experiment")] + [System.ComponentModel.DescriptionAttribute("Name of the experiment")] + public string Experiment + { + get + { + return _experiment; + } + set + { + _experiment = value; + } + } + + /// + /// Name of the experimenter + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] + [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] + public System.Collections.Generic.List Experimenter + { + get + { + return _experimenter; + } + set + { + _experimenter = value; + } + } + + /// + /// Date of the experiment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the experiment")] + public System.DateTimeOffset Date + { + get + { + return _date; + } + set + { + _date = value; + } + } + + /// + /// Root path where data will be logged + /// + [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] + public string RootPath + { + get + { + return _rootPath; + } + set + { + _rootPath = value; + } + } + + /// + /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. + /// + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + + "t provided, it will be generated using subject and date.")] + public string SessionName + { + get + { + return _sessionName; + } + set + { + _sessionName = value; + } + } + + /// + /// Name of the subject + /// + [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Name of the subject")] + public string Subject + { + get + { + return _subject; + } + set + { + _subject = value; + } + } + + /// + /// Version of the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] + [System.ComponentModel.DescriptionAttribute("Version of the experiment")] + public string ExperimentVersion + { + get + { + return _experimentVersion; + } + set + { + _experimentVersion = value; + } + } + + /// + /// Notes about the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] + public string Notes + { + get + { + return _notes; + } + set + { + _notes = value; + } + } + + /// + /// Commit hash of the repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] + [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] + public string CommitHash + { + get + { + return _commitHash; + } + set + { + _commitHash = value; + } + } + + /// + /// Allow running from a dirty repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] + [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] + public bool AllowDirtyRepo + { + get + { + return _allowDirtyRepo; + } + set + { + _allowDirtyRepo = value; + } + } + + /// + /// Skip hardware validation + /// + [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] + [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] + public bool SkipHardwareValidation + { + get + { + return _skipHardwareValidation; + } + set + { + _skipHardwareValidation = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("Experiment = " + _experiment + ", "); + stringBuilder.Append("Experimenter = " + _experimenter + ", "); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("RootPath = " + _rootPath + ", "); + stringBuilder.Append("SessionName = " + _sessionName + ", "); + stringBuilder.Append("Subject = " + _subject + ", "); + stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); + stringBuilder.Append("Notes = " + _notes + ", "); + stringBuilder.Append("CommitHash = " + _commitHash + ", "); + stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); + stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BaseModel + { + + public BaseModel() + { + } + + protected BaseModel(BaseModel other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class CameraControllerSpinnakerCamera + { + + private string _deviceType; + + private string _deviceName; + + private BaseModel _additionalSettings; + + private BaseModel _calibration; + + private System.Collections.Generic.Dictionary _cameras; + + private int? _frameRate; + + public CameraControllerSpinnakerCamera() + { + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); + } + + protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) + { + _deviceType = other._deviceType; + _deviceName = other._deviceName; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _cameras = other._cameras; + _frameRate = other._frameRate; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + /// + /// Cameras to be instantiated + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] + public System.Collections.Generic.Dictionary Cameras + { + get + { + return _cameras; + } + set + { + _cameras = value; + } + } + + /// + /// Frame rate of the trigger to all cameras + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Payload for heartbeat messages indicating system health status. + /// + ///Heartbeat messages are used to monitor the health and availability + ///of system components. They include a status indicator and optional + ///context information. + /// + ///Attributes: + /// context: Optional additional data about the system state + /// status: Current health status of the component + /// + ///Examples: + /// ```python + /// heartbeat = HeartbeatPayload( + /// status=HeartbeatStatus.OK, + /// context={"cpu_usage": 0.25, "memory_usage": 0.60} + /// ) + /// print(heartbeat.status) # HeartbeatStatus.OK + /// + /// warning_heartbeat = HeartbeatPayload( + /// status=HeartbeatStatus.WARNING, + /// context={"disk_space_low": True} + /// ) + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Payload for heartbeat messages indicating system health status. + + Heartbeat messages are used to monitor the health and availability + of system components. They include a status indicator and optional + context information. + + Attributes: + context: Optional additional data about the system state + status: Current health status of the component + + Examples: + ```python + heartbeat = HeartbeatPayload( + status=HeartbeatStatus.OK, + context={""cpu_usage"": 0.25, ""memory_usage"": 0.60} + ) + print(heartbeat.status) # HeartbeatStatus.OK + + warning_heartbeat = HeartbeatPayload( + status=HeartbeatStatus.WARNING, + context={""disk_space_low"": True} + ) + ```")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class HeartbeatPayload : RegisteredPayload + { + + private object _context; + + private HeartbeatStatus _status; + + public HeartbeatPayload() + { + } + + protected HeartbeatPayload(HeartbeatPayload other) : + base(other) + { + _context = other._context; + _status = other._status; + } + + /// + /// Additional context for the heartbeat message. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("context")] + [System.ComponentModel.DescriptionAttribute("Additional context for the heartbeat message.")] + public object Context + { + get + { + return _context; + } + set + { + _context = value; + } + } + + /// + /// The status of the heartbeat message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("status", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The status of the heartbeat message")] + public HeartbeatStatus Status + { + get + { + return _status; + } + set + { + _status = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HeartbeatPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HeartbeatPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Context = " + _context + ", "); + stringBuilder.Append("Status = " + _status); + return true; + } + } + + + /// + /// Enumeration of possible heartbeat status values. + /// + ///Represents the health status of a system component, + ///with higher values indicating more severe issues. + /// + ///Examples: + /// ```python + /// HeartbeatStatus.OK # + /// HeartbeatStatus.CRITICAL > HeartbeatStatus.WARNING # True + /// int(HeartbeatStatus.ERROR) # 2 + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + public enum HeartbeatStatus + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Ok = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Warning = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Error = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Critical = 3, + } + + + /// + /// Enumeration of log levels for the logging system. + /// + ///Follows standard Python logging levels with integer values + ///that allow for easy comparison and filtering. + /// + ///Examples: + /// ```python + /// LogLevel.ERROR > LogLevel.WARNING # True + /// LogLevel.DEBUG.value # 10 + /// str(LogLevel.INFO) # 'LogLevel.INFO' + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + public enum LogLevel + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Critical = 50, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Error = 40, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Warning = 30, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Info = 20, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Debug = 10, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Notset = 0, + } + + + /// + /// Payload for log messages containing logging information. + /// + ///This payload carries log data including the message content, + ///severity level, optional context, and application version. + /// + ///Attributes: + /// message: The actual log message text + /// level: Severity level of the log entry + /// context: Optional additional data related to the log + /// application_version: Version of the application generating the log + /// + ///Examples: + /// ```python + /// log_payload = LogPayload( + /// message="System startup complete", + /// level=LogLevel.INFO, + /// context={"operator": "John Doe"}, + /// application_version="1.0.0" + /// ) + /// print(log_payload.level) # LogLevel.INFO + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Payload for log messages containing logging information. + + This payload carries log data including the message content, + severity level, optional context, and application version. + + Attributes: + message: The actual log message text + level: Severity level of the log entry + context: Optional additional data related to the log + application_version: Version of the application generating the log + + Examples: + ```python + log_payload = LogPayload( + message=""System startup complete"", + level=LogLevel.INFO, + context={""operator"": ""John Doe""}, + application_version=""1.0.0"" + ) + print(log_payload.level) # LogLevel.INFO + ```")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class LogPayload : RegisteredPayload + { + + private string _message; + + private LogLevel _level; + + private object _context; + + private string _applicationVersion; + + public LogPayload() + { + _level = AindJustFramesSchemas.MessageProtocol.LogLevel.Debug; + } + + protected LogPayload(LogPayload other) : + base(other) + { + _message = other._message; + _level = other._level; + _context = other._context; + _applicationVersion = other._applicationVersion; + } + + /// + /// The message of the log + /// + [Newtonsoft.Json.JsonPropertyAttribute("message", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The message of the log")] + public string Message + { + get + { + return _message; + } + set + { + _message = value; + } + } + + /// + /// The level of the log message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("level")] + [System.ComponentModel.DescriptionAttribute("The level of the log message")] + public LogLevel Level + { + get + { + return _level; + } + set + { + _level = value; + } + } + + /// + /// Additional context for the log message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("context")] + [System.ComponentModel.DescriptionAttribute("Additional context for the log message")] + public object Context + { + get + { + return _context; + } + set + { + _context = value; + } + } + + /// + /// The version of the application + /// + [Newtonsoft.Json.JsonPropertyAttribute("application_version")] + [System.ComponentModel.DescriptionAttribute("The version of the application")] + public string ApplicationVersion + { + get + { + return _applicationVersion; + } + set + { + _applicationVersion = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new LogPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Message = " + _message + ", "); + stringBuilder.Append("Level = " + _level + ", "); + stringBuilder.Append("Context = " + _context + ", "); + stringBuilder.Append("ApplicationVersion = " + _applicationVersion); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Message + { + + private MessageType _messageType; + + private int _protocolVersion; + + private System.DateTimeOffset? _timestamp; + + private object _payload; + + private string _processId; + + private string _hostname; + + private string _rigName; + + public Message() + { + _protocolVersion = 0; + } + + protected Message(Message other) + { + _messageType = other._messageType; + _protocolVersion = other._protocolVersion; + _timestamp = other._timestamp; + _payload = other._payload; + _processId = other._processId; + _hostname = other._hostname; + _rigName = other._rigName; + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] + public MessageType MessageType + { + get + { + return _messageType; + } + set + { + _messageType = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] + public int ProtocolVersion + { + get + { + return _protocolVersion; + } + set + { + _protocolVersion = value; + } + } + + /// + /// The timestamp of the message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] + public System.DateTimeOffset? Timestamp + { + get + { + return _timestamp; + } + set + { + _timestamp = value; + } + } + + /// + /// The payload of the message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The payload of the message")] + public object Payload + { + get + { + return _payload; + } + set + { + _payload = value; + } + } + + /// + /// Process that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Process that created the message")] + public string ProcessId + { + get + { + return _processId; + } + set + { + _processId = value; + } + } + + /// + /// Hostname that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] + public string Hostname + { + get + { + return _hostname; + } + set + { + _hostname = value; + } + } + + /// + /// Rig name that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] + public string RigName + { + get + { + return _rigName; + } + set + { + _rigName = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Message(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Message(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("MessageType = " + _messageType + ", "); + stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); + stringBuilder.Append("Timestamp = " + _timestamp + ", "); + stringBuilder.Append("Payload = " + _payload + ", "); + stringBuilder.Append("ProcessId = " + _processId + ", "); + stringBuilder.Append("Hostname = " + _hostname + ", "); + stringBuilder.Append("RigName = " + _rigName); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Enumeration of possible message types in the protocol. + /// + ///Examples: + /// ```python + /// MessageType.REQUEST # 'request' + /// MessageType.REPLY # 'reply' + /// MessageType.EVENT # 'event' + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum MessageType + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="request")] + Request = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="reply")] + Reply = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="event")] + Event = 2, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Rect + { + + private int _x; + + private int _y; + + private int _width; + + private int _height; + + public Rect() + { + _x = 0; + _y = 0; + _width = 0; + _height = 0; + } + + protected Rect(Rect other) + { + _x = other._x; + _y = other._y; + _width = other._width; + _height = other._height; + } + + /// + /// X coordinate of the top-left corner + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] + public int X + { + get + { + return _x; + } + set + { + _x = value; + } + } + + /// + /// Y coordinate of the top-left corner + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] + public int Y + { + get + { + return _y; + } + set + { + _y = value; + } + } + + /// + /// Width of the rectangle + /// + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] + public int Width + { + get + { + return _width; + } + set + { + _width = value; + } + } + + /// + /// Height of the rectangle + /// + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] + public int Height + { + get + { + return _height; + } + set + { + _height = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class RegisteredMessages + { + + private MessageType _messageType; + + private int _protocolVersion; + + private System.DateTimeOffset? _timestamp; + + private RegisteredPayload _payload; + + private string _processId; + + private string _hostname; + + private string _rigName; + + public RegisteredMessages() + { + _protocolVersion = 0; + } + + protected RegisteredMessages(RegisteredMessages other) + { + _messageType = other._messageType; + _protocolVersion = other._protocolVersion; + _timestamp = other._timestamp; + _payload = other._payload; + _processId = other._processId; + _hostname = other._hostname; + _rigName = other._rigName; + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] + public MessageType MessageType + { + get + { + return _messageType; + } + set + { + _messageType = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] + public int ProtocolVersion + { + get + { + return _protocolVersion; + } + set + { + _protocolVersion = value; + } + } + + /// + /// The timestamp of the message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] + public System.DateTimeOffset? Timestamp + { + get + { + return _timestamp; + } + set + { + _timestamp = value; + } + } + + /// + /// The payload of the message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The payload of the message")] + public RegisteredPayload Payload + { + get + { + return _payload; + } + set + { + _payload = value; + } + } + + /// + /// Process that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Process that created the message")] + public string ProcessId + { + get + { + return _processId; + } + set + { + _processId = value; + } + } + + /// + /// Hostname that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] + public string Hostname + { + get + { + return _hostname; + } + set + { + _hostname = value; + } + } + + /// + /// Rig name that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] + public string RigName + { + get + { + return _rigName; + } + set + { + _rigName = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RegisteredMessages(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RegisteredMessages(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("MessageType = " + _messageType + ", "); + stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); + stringBuilder.Append("Timestamp = " + _timestamp + ", "); + stringBuilder.Append("Payload = " + _payload + ", "); + stringBuilder.Append("ProcessId = " + _processId + ", "); + stringBuilder.Append("Hostname = " + _hostname + ", "); + stringBuilder.Append("RigName = " + _rigName); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "payload_type")] + [JsonInheritanceAttribute("HeartbeatPayload", typeof(HeartbeatPayload))] + [JsonInheritanceAttribute("LogPayload", typeof(LogPayload))] + [JsonInheritanceAttribute("Start", typeof(StartPayload))] + [JsonInheritanceAttribute("Stop", typeof(StopPayload))] + [JsonInheritanceAttribute("SatelliteRig", typeof(SatelliteRigPayload))] + [JsonInheritanceAttribute("SatelliteSession", typeof(SatelliteSessionPayload))] + public abstract partial class RegisteredPayload + { + + protected RegisteredPayload() + { + } + + protected RegisteredPayload(RegisteredPayload other) + { + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class SatelliteRig + { + + private string _aindBehaviorServicesPkgVersion; + + private string _version; + + private string _computerName; + + private string _rigName; + + private ZmqPubSub _zmqConnection; + + private CameraControllerSpinnakerCamera _triggeredCameraController0; + + private CameraControllerSpinnakerCamera _triggeredCameraController1; + + private bool _isSatellite; + + public SatelliteRig() + { + _aindBehaviorServicesPkgVersion = "0.12.3"; + _version = "0.5.0-rc0"; + _zmqConnection = new ZmqPubSub(); + _isSatellite = true; + } + + protected SatelliteRig(SatelliteRig other) + { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _computerName = other._computerName; + _rigName = other._rigName; + _zmqConnection = other._zmqConnection; + _triggeredCameraController0 = other._triggeredCameraController0; + _triggeredCameraController1 = other._triggeredCameraController1; + _isSatellite = other._isSatellite; + } + + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; + } + } + + /// + /// Remote Computer name + /// + [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Remote Computer name")] + public string ComputerName + { + get + { + return _computerName; + } + set + { + _computerName = value; + } + } + + /// + /// Rig name + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rig name")] + public string RigName + { + get + { + return _rigName; + } + set + { + _rigName = value; + } + } + + /// + /// ZMQ connection for communication. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] + public ZmqPubSub ZmqConnection + { + get + { + return _zmqConnection; + } + set + { + _zmqConnection = value; + } + } + + /// + /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_0")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera0 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController0 + { + get + { + return _triggeredCameraController0; + } + set + { + _triggeredCameraController0 = value; + } + } + + /// + /// Camera controller to triggered cameras. Will use Camera1 register as a trigger. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_1")] + [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera1 register as a trigger.")] + public CameraControllerSpinnakerCamera TriggeredCameraController1 + { + get + { + return _triggeredCameraController1; + } + set + { + _triggeredCameraController1 = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("is_satellite")] + public bool IsSatellite + { + get + { + return _isSatellite; + } + set + { + _isSatellite = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteRig(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteRig(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("ComputerName = " + _computerName + ", "); + stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("ZmqConnection = " + _zmqConnection + ", "); + stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); + stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); + stringBuilder.Append("IsSatellite = " + _isSatellite); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class SatelliteRigPayload : RegisteredPayload + { + + private SatelliteRig _rig; + + public SatelliteRigPayload() + { + _rig = new SatelliteRig(); + } + + protected SatelliteRigPayload(SatelliteRigPayload other) : + base(other) + { + _rig = other._rig; + } + + /// + /// Satellite Rig configuration. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("rig", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Satellite Rig configuration.")] + public SatelliteRig Rig + { + get + { + return _rig; + } + set + { + _rig = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteRigPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteRigPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Rig = " + _rig); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class SatelliteSessionPayload : RegisteredPayload + { + + private AindBehaviorSessionModel _session; + + public SatelliteSessionPayload() + { + _session = new AindBehaviorSessionModel(); + } + + protected SatelliteSessionPayload(SatelliteSessionPayload other) : + base(other) + { + _session = other._session; + } + + /// + /// Satellite session configuration. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("session", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Satellite session configuration.")] + public AindBehaviorSessionModel Session + { + get + { + return _session; + } + set + { + _session = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteSessionPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteSessionPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Session = " + _session); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class SpinnakerCamera + { + + private string _deviceType; + + private string _deviceName; + + private BaseModel _additionalSettings; + + private BaseModel _calibration; + + private string _serialNumber; + + private int _binning; + + private SpinnakerCameraColorProcessing _colorProcessing; + + private int _exposure; + + private double _gain; + + private double? _gamma; + + private SpinnakerCameraAdcBitDepth? _adcBitDepth; + + private SpinnakerCameraPixelFormat? _pixelFormat; + + private Rect _regionOfInterest; + + private VideoWriter _videoWriter; + + public SpinnakerCamera() + { + _deviceType = "SpinnakerCamera"; + _binning = 1; + _colorProcessing = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraColorProcessing.Default; + _exposure = 1000; + _gain = 0D; + _adcBitDepth = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraAdcBitDepth.Adc8bit; + _pixelFormat = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraPixelFormat.Mono8; + _regionOfInterest = new Rect(); + } + + protected SpinnakerCamera(SpinnakerCamera other) + { + _deviceType = other._deviceType; + _deviceName = other._deviceName; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _serialNumber = other._serialNumber; + _binning = other._binning; + _colorProcessing = other._colorProcessing; + _exposure = other._exposure; + _gain = other._gain; + _gamma = other._gamma; + _adcBitDepth = other._adcBitDepth; + _pixelFormat = other._pixelFormat; + _regionOfInterest = other._regionOfInterest; + _videoWriter = other._videoWriter; + } + + /// + /// Device type + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + [System.ComponentModel.DescriptionAttribute("Device type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Device name + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Device name")] + public string DeviceName + { + get + { + return _deviceName; + } + set + { + _deviceName = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + /// + /// Camera serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Camera serial number")] + public string SerialNumber + { + get + { + return _serialNumber; + } + set + { + _serialNumber = value; + } + } + + /// + /// Binning + /// + [Newtonsoft.Json.JsonPropertyAttribute("binning")] + [System.ComponentModel.DescriptionAttribute("Binning")] + public int Binning + { + get + { + return _binning; + } + set + { + _binning = value; + } + } + + /// + /// Color processing + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] + [System.ComponentModel.DescriptionAttribute("Color processing")] + public SpinnakerCameraColorProcessing ColorProcessing + { + get + { + return _colorProcessing; + } + set + { + _colorProcessing = value; + } + } + + /// + /// Exposure time + /// + [Newtonsoft.Json.JsonPropertyAttribute("exposure")] + [System.ComponentModel.DescriptionAttribute("Exposure time")] + public int Exposure + { + get + { + return _exposure; + } + set + { + _exposure = value; + } + } + + /// + /// Gain + /// + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain")] + public double Gain + { + get + { + return _gain; + } + set + { + _gain = value; + } + } + + /// + /// Gamma. If None, will disable gamma correction. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("gamma")] + [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] + public double? Gamma + { + get + { + return _gamma; + } + set + { + _gamma = value; + } + } + + /// + /// ADC bit depth. If None will be left as default. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] + [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] + public SpinnakerCameraAdcBitDepth? AdcBitDepth + { + get + { + return _adcBitDepth; + } + set + { + _adcBitDepth = value; + } + } + + /// + /// Pixel format. If None will be left as default. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] + [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] + public SpinnakerCameraPixelFormat? PixelFormat + { + get + { + return _pixelFormat; + } + set + { + _pixelFormat = value; + } + } + + /// + /// Region of interest + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] + [System.ComponentModel.DescriptionAttribute("Region of interest")] + public Rect RegionOfInterest + { + get + { + return _regionOfInterest; + } + set + { + _regionOfInterest = value; + } + } + + /// + /// Video writer. If not provided, no video will be saved. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] + [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] + public VideoWriter VideoWriter + { + get + { + return _videoWriter; + } + set + { + _videoWriter = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("DeviceName = " + _deviceName + ", "); + stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("Binning = " + _binning + ", "); + stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); + stringBuilder.Append("Exposure = " + _exposure + ", "); + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("Gamma = " + _gamma + ", "); + stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); + stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); + stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraAdcBitDepth + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Adc8bit = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Adc10bit = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Adc12bit = 2, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraPixelFormat + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Mono8 = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Mono16 = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Rgb8packed = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Bayergr8 = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] + Bayerrg8 = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] + Bayergb8 = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] + Bayerbg8 = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] + Bayergr16 = 7, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] + Bayerrg16 = 8, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] + Bayergb16 = 9, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Bayerbg16 = 10, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] + Mono12packed = 11, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] + Bayergr12packed = 12, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] + Bayerrg12packed = 13, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] + Bayergb12packed = 14, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] + Bayerbg12packed = 15, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] + Yuv411packed = 16, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] + Yuv422packed = 17, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] + Yuv444packed = 18, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] + Mono12p = 19, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Bayergr12p = 20, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] + Bayerrg12p = 21, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] + Bayergb12p = 22, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] + Bayerbg12p = 23, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] + Ycbcr8 = 24, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] + Ycbcr4228 = 25, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] + Ycbcr4118 = 26, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] + Bgr8 = 27, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] + Bgra8 = 28, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] + Mono10packed = 29, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Bayergr10packed = 30, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] + Bayerrg10packed = 31, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] + Bayergb10packed = 32, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] + Bayerbg10packed = 33, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] + Mono10p = 34, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] + Bayergr10p = 35, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] + Bayerrg10p = 36, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] + Bayergb10p = 37, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] + Bayerbg10p = 38, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] + Mono1p = 39, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Mono2p = 40, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] + Mono4p = 41, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] + Mono8s = 42, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] + Mono10 = 43, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] + Mono12 = 44, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] + Mono14 = 45, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] + Mono16s = 46, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] + Mono32f = 47, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] + Bayerbg10 = 48, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] + Bayerbg12 = 49, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Bayergb10 = 50, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] + Bayergb12 = 51, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] + Bayergr10 = 52, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] + Bayergr12 = 53, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] + Bayerrg10 = 54, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] + Bayerrg12 = 55, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] + Rgba8 = 56, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] + Rgba10 = 57, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] + Rgba10p = 58, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] + Rgba12 = 59, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] + Rgba12p = 60, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] + Rgba14 = 61, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] + Rgba16 = 62, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] + Rgb8 = 63, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] + Rgb8Planar = 64, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] + Rgb10 = 65, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] + Rgb10Planar = 66, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] + Rgb10p = 67, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] + Rgb10p32 = 68, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] + Rgb12 = 69, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] + Rgb12Planar = 70, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] + Rgb12p = 71, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] + Rgb14 = 72, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] + Rgb16 = 73, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] + Rgb16s = 74, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] + Rgb32f = 75, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] + Rgb16Planar = 76, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] + Rgb565p = 77, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] + Bgra10 = 78, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] + Bgra10p = 79, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] + Bgra12 = 80, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] + Bgra12p = 81, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] + Bgra14 = 82, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] + Bgra16 = 83, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] + Rgba32f = 84, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] + Bgr10 = 85, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] + Bgr10p = 86, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] + Bgr12 = 87, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] + Bgr12p = 88, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] + Bgr14 = 89, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] + Bgr16 = 90, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] + Bgr565p = 91, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] + R8 = 92, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] + R10 = 93, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] + R12 = 94, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] + R16 = 95, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] + G8 = 96, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] + G10 = 97, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] + G12 = 98, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] + G16 = 99, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] + B8 = 100, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] + B10 = 101, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] + B12 = 102, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] + B16 = 103, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] + Coord3dAbc8 = 104, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] + Coord3dAbc8Planar = 105, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] + Coord3dAbc10p = 106, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] + Coord3dAbc10pPlanar = 107, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] + Coord3dAbc12p = 108, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] + Coord3dAbc12pPlanar = 109, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] + Coord3dAbc16 = 110, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] + Coord3dAbc16Planar = 111, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] + Coord3dAbc32f = 112, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] + Coord3dAbc32fPlanar = 113, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] + Coord3dAc8 = 114, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] + Coord3dAc8Planar = 115, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] + Coord3dAc10p = 116, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] + Coord3dAc10pPlanar = 117, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] + Coord3dAc12p = 118, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] + Coord3dAc12pPlanar = 119, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] + Coord3dAc16 = 120, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] + Coord3dAc16Planar = 121, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] + Coord3dAc32f = 122, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] + Coord3dAc32fPlanar = 123, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] + Coord3dA8 = 124, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] + Coord3dA10p = 125, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] + Coord3dA12p = 126, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] + Coord3dA16 = 127, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] + Coord3dA32f = 128, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] + Coord3dB8 = 129, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] + Coord3dB10p = 130, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] + Coord3dB12p = 131, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] + Coord3dB16 = 132, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] + Coord3dB32f = 133, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] + Coord3dC8 = 134, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] + Coord3dC10p = 135, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] + Coord3dC12p = 136, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] + Coord3dC16 = 137, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="138")] + Coord3dC32f = 138, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="139")] + Confidence1 = 139, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="140")] + Confidence1p = 140, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="141")] + Confidence8 = 141, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="142")] + Confidence16 = 142, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="143")] + Confidence32f = 143, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class StartPayload : RegisteredPayload + { + + public StartPayload() + { + } + + protected StartPayload(StartPayload other) : + base(other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StartPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new StartPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return base.PrintMembers(stringBuilder); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class StopPayload : RegisteredPayload + { + + public StopPayload() + { + } + + protected StopPayload(StopPayload other) : + base(other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StopPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new StopPayload(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return base.PrintMembers(stringBuilder); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] + [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] + [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VideoWriter + { + + public VideoWriter() + { + } + + protected VideoWriter(VideoWriter other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VideoWriterFfmpeg : VideoWriter + { + + private int _frameRate; + + private string _containerExtension; + + private string _outputArguments; + + private string _inputArguments; + + public VideoWriterFfmpeg() + { + _frameRate = 30; + _containerExtension = "mp4"; + _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; + _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; + } + + protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : + base(other) + { + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _outputArguments = other._outputArguments; + _inputArguments = other._inputArguments; + } + + /// + /// Encoding frame rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } + } + + /// + /// Container extension + /// + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension + { + get + { + return _containerExtension; + } + set + { + _containerExtension = value; + } + } + + /// + /// Output arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] + [System.ComponentModel.DescriptionAttribute("Output arguments")] + public string OutputArguments + { + get + { + return _outputArguments; + } + set + { + _outputArguments = value; + } + } + + /// + /// Input arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] + [System.ComponentModel.DescriptionAttribute("Input arguments")] + public string InputArguments + { + get + { + return _inputArguments; + } + set + { + _inputArguments = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); + stringBuilder.Append("InputArguments = " + _inputArguments); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VideoWriterOpenCv : VideoWriter + { + + private int _frameRate; + + private string _containerExtension; + + private string _fourCc; + + public VideoWriterOpenCv() + { + _frameRate = 30; + _containerExtension = "avi"; + _fourCc = "FMP4"; + } + + protected VideoWriterOpenCv(VideoWriterOpenCv other) : + base(other) + { + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _fourCc = other._fourCc; + } + + /// + /// Encoding frame rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } + } + + /// + /// Container extension + /// + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension + { + get + { + return _containerExtension; + } + set + { + _containerExtension = value; + } + } + + /// + /// Four character code + /// + [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] + [System.ComponentModel.DescriptionAttribute("Four character code")] + public string FourCc + { + get + { + return _fourCc; + } + set + { + _fourCc = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("FourCc = " + _fourCc); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ZmqConnection + { + + private string _connectionString; + + private string _topic; + + public ZmqConnection() + { + _connectionString = "@tcp://localhost:5556"; + _topic = ""; + } + + protected ZmqConnection(ZmqConnection other) + { + _connectionString = other._connectionString; + _topic = other._topic; + } + + /// + /// The connection string for the ZMQ socket. + /// + [Newtonsoft.Json.JsonPropertyAttribute("connection_string")] + [System.ComponentModel.DescriptionAttribute("The connection string for the ZMQ socket.")] + public string ConnectionString + { + get + { + return _connectionString; + } + set + { + _connectionString = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("topic")] + public string Topic + { + get + { + return _topic; + } + set + { + _topic = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqConnection(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ZmqConnection(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("ConnectionString = " + _connectionString + ", "); + stringBuilder.Append("Topic = " + _topic); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ZmqPubSub + { + + private ZmqConnection _pub; + + private ZmqConnection _sub; + + public ZmqPubSub() + { + _pub = new ZmqConnection(); + _sub = new ZmqConnection(); + } + + protected ZmqPubSub(ZmqPubSub other) + { + _pub = other._pub; + _sub = other._sub; + } + + /// + /// ZMQ Publisher + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("pub", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ Publisher")] + public ZmqConnection Pub + { + get + { + return _pub; + } + set + { + _pub = value; + } + } + + /// + /// ZMQ Subscriber + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("sub", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ Subscriber")] + public ZmqConnection Sub + { + get + { + return _sub; + } + set + { + _sub = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqPubSub(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ZmqPubSub(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Pub = " + _pub + ", "); + stringBuilder.Append("Sub = " + _sub); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum SpinnakerCameraColorProcessing + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] + Default = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] + NoColorProcessing = 1, + } + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] + internal class JsonInheritanceAttribute : System.Attribute + { + public JsonInheritanceAttribute(string key, System.Type type) + { + Key = key; + Type = type; + } + + public string Key { get; private set; } + + public System.Type Type { get; private set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter + { + internal static readonly string DefaultDiscriminatorName = "discriminator"; + + private readonly string _discriminatorName; + + [System.ThreadStatic] + private static bool _isReading; + + [System.ThreadStatic] + private static bool _isWriting; + + public JsonInheritanceConverter() + { + _discriminatorName = DefaultDiscriminatorName; + } + + public JsonInheritanceConverter(string discriminatorName) + { + _discriminatorName = discriminatorName; + } + + public string DiscriminatorName { get { return _discriminatorName; } } + + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) + { + try + { + _isWriting = true; + + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); + jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminatorName, GetSubtypeDiscriminator(value.GetType()))); + writer.WriteToken(jObject.CreateReader()); + } + finally + { + _isWriting = false; + } + } + + public override bool CanWrite + { + get + { + if (_isWriting) + { + _isWriting = false; + return false; + } + return true; + } + } + + public override bool CanRead + { + get + { + if (_isReading) + { + _isReading = false; + return false; + } + return true; + } + } + + public override bool CanConvert(System.Type objectType) + { + return true; + } + + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) + { + var jObject = serializer.Deserialize(reader); + if (jObject == null) + return null; + + var discriminatorValue = jObject.GetValue(_discriminatorName); + var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; + var subtype = GetObjectSubtype(objectType, discriminator); + + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; + if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminatorName)) + { + jObject.Remove(_discriminatorName); + } + + try + { + _isReading = true; + return serializer.Deserialize(jObject.CreateReader(), subtype); + } + finally + { + _isReading = false; + } + } + + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) + { + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) + { + if (attribute.Key == discriminator) + return attribute.Type; + } + + return objectType; + } + + private string GetSubtypeDiscriminator(System.Type objectType) + { + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) + { + if (attribute.Type == objectType) + return attribute.Key; + } + + return objectType.Name; + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DefaultPropertyAttribute("Type")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchRegisteredPayload : Bonsai.Expressions.SingleArgumentExpressionBuilder + { + + public Bonsai.Expressions.TypeMapping Type { get; set; } + + public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + { + var typeMapping = Type; + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(RegisteredPayload); + return System.Linq.Expressions.Expression.Call( + typeof(MatchRegisteredPayload), + "Process", + new System.Type[] { returnType }, + System.Linq.Enumerable.Single(arguments)); + } + + + private static System.IObservable Process(System.IObservable source) + where TResult : RegisteredPayload + { + return System.Reactive.Linq.Observable.Create(observer => + { + var sourceObserver = System.Reactive.Observer.Create( + value => + { + var match = value as TResult; + if (match != null) observer.OnNext(match); + }, + observer.OnError, + observer.OnCompleted); + return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); + }); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DefaultPropertyAttribute("Type")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder + { + + public Bonsai.Expressions.TypeMapping Type { get; set; } + + public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + { + var typeMapping = Type; + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); + return System.Linq.Expressions.Expression.Call( + typeof(MatchVideoWriter), + "Process", + new System.Type[] { returnType }, + System.Linq.Enumerable.Single(arguments)); + } + + + private static System.IObservable Process(System.IObservable source) + where TResult : VideoWriter + { + return System.Reactive.Linq.Observable.Create(observer => + { + var sourceObserver = System.Reactive.Observer.Create( + value => + { + var match = value as TResult; + if (match != null) observer.OnNext(match); + }, + observer.OnError, + observer.OnCompleted); + return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); + }); + } + } + + + /// + /// Serializes a sequence of data model objects into JSON strings. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] + [Bonsai.CombinatorAttribute()] + public partial class SerializeToJson + { + + public Newtonsoft.Json.Formatting Formatting { get; set; } + + private System.IObservable Process(System.IObservable source) + { + var formatting = Formatting; + return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + } + + + /// + /// Deserializes a sequence of JSON strings into data model objects. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] + [System.ComponentModel.DefaultPropertyAttribute("Type")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder + { + + public DeserializeFromJson() + { + Type = new Bonsai.Expressions.TypeMapping(); + } + + public Bonsai.Expressions.TypeMapping Type { get; set; } + + public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + { + var typeMapping = (Bonsai.Expressions.TypeMapping)Type; + var returnType = typeMapping.GetType().GetGenericArguments()[0]; + return System.Linq.Expressions.Expression.Call( + typeof(DeserializeFromJson), + "Process", + new System.Type[] { returnType }, + System.Linq.Enumerable.Single(arguments)); + } + + private static System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.DeserializeObject(value)); + } + } +} \ No newline at end of file diff --git a/src/Extensions/BuildRegisteredMessage.cs b/src/Extensions/BuildRegisteredMessage.cs new file mode 100644 index 0000000..90b46ec --- /dev/null +++ b/src/Extensions/BuildRegisteredMessage.cs @@ -0,0 +1,51 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; +using AindJustFramesSchemas.MessageProtocol; +using System.Reactive; + +[Combinator] +[Description("")] +[WorkflowElementCategory(ElementCategory.Transform)] +public class BuildRegisteredMessage +{ + private MessageType messageType = MessageType.Event; + public MessageType MessageType + { + get { return messageType; } + set { messageType = value; } + } + + private const int protocolVersion = 0; + + private string rigName; + public string RigName + { + get { return rigName; } + set { rigName = value; } + } + + public IObservable Process(IObservable source) + { + return Process(source.Select(value => new Timestamped(value, DateTimeOffset.UtcNow))); + } + + public IObservable Process(IObservable> source) + { + string hostname = Environment.MachineName; + string processId = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); + return source.Select(value => new RegisteredMessages() + { + MessageType = MessageType, + ProtocolVersion = protocolVersion, + Timestamp = value.Timestamp, + ProcessId = processId, + Hostname = hostname, + RigName = RigName, + Payload = value.Value + }); + } +} diff --git a/src/Extensions/CameraQc.bonsai b/src/Extensions/CameraQc.bonsai index b577de8..eb19dde 100644 --- a/src/Extensions/CameraQc.bonsai +++ b/src/Extensions/CameraQc.bonsai @@ -7,6 +7,8 @@ xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:p2="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -541,10 +543,120 @@ - + + Check Trigger Order + + + + HarpBehaviorEvents + + + + Include + Write + + + + + + + + + + Source1 + + + Value + + + + None + + + + + + + + + + + + + Seconds + + + HarpBehaviorEvents + + + + Include + Event + + + + + + + + + + + + + Seconds + + + + + + + 1 + + + + + + + + Source1 + + + + + + + + + + + Received a frame event before start trigger. This likely means this workflow started after the master workflow. + + + + + + + + + + + + + + + + + + + + + + + + + - - - + \ No newline at end of file diff --git a/src/Extensions/HarpDevices.bonsai b/src/Extensions/HarpDevices.bonsai index 0b25592..bd63533 100644 --- a/src/Extensions/HarpDevices.bonsai +++ b/src/Extensions/HarpDevices.bonsai @@ -3,33 +3,66 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:p1="clr-namespace:AindJustFramesSchemas;assembly=Extensions" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" + xmlns:p2="clr-namespace:AindJustFramesSchemas.MessageProtocol;assembly=Extensions" + xmlns:p3="clr-namespace:;assembly=Extensions" xmlns="https://bonsai-rx.org/2018/workflow"> HarpBehaviorCommands - - todo - + + RigSchema + + + NotSatellite + + + + Source1 + + + IsSatellite + + + + + + + + + + - - 0 + + None BehaviorBoard + + Source1 + + + + 1 + + + + + + + RigSchema + HarpBehaviorCommands - - internalPub - RigSchema @@ -52,6 +85,9 @@ COM5 + + internalPub + internalPub @@ -59,6 +95,25 @@ MessageBytes + + HarpZmqTopic + + + + + + + + RigSchema + + + ZmqConnection.Pub.ConnectionString + + + + + + tcp://localhost:5557 @@ -67,29 +122,86 @@ - + - - + - + + + + + + + + + + - - todo - + + RigSchema + + + + + + Source1 + + + IsSatellite + + + + + + + + - - 0 + + None ZeroMQBehaviorBoard + + Source1 + + + + 1 + + + + + + + RigSchema + + + RigSchema + + + ZmqConnection.Sub.ConnectionString + + + + + + + + HarpZmqTopic + + + + + + tcp://localhost:5557 @@ -107,6 +219,14 @@ + + + + + + + + @@ -124,19 +244,35 @@ HarpBehaviorEvents - - todo - + + RigSchema - - BehaviorBoardInitialization + + NotSatellite - - + + Source1 + + IsSatellite + + + + + + + + + + + + + BehaviorBoardInitialization + + - TriggerHarpReadDump + StartExperiment Write @@ -158,7 +294,7 @@ Write - PortDI PortDIO AnalogData Camera0 Camera1 + PortDI PortDIO Camera0 Camera1 @@ -170,6 +306,169 @@ HarpBehaviorCommands + + + + + + + + + + + + + + RigSchema + + + NotSatellite + + + + Source1 + + + IsSatellite + + + + + + + + + + + + + + None + + + + MainZmqLogic + + + + Source1 + + + + 1 + + + + + + + RigSchema + + + RigSchema + + + SatelliteRigs + + + + + + + + + Source1 + + + satelliteRig + + + EnableExperiment + + + + + + satelliteRig + + + RigName + + + + + + + + + Request + + + + satelliteRig + + + ZmqConnection.Pub + + + ConnectionString + + + + + + + + MessageProtocolZmqTopic + + + + + + + + + tcp://localhost:5557 + + + + Last + + + + + + Payload + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -177,28 +476,137 @@ + + + + - StartExperiment + RigSchema - - TriggerHarpReadDump + + + + + Source1 + + + IsSatellite + + + + + + + + + + + + None + + + + SatelliteZmqLogic + + + + Source1 + + + + 1 + + + + + + + RigSchema + + + InboundMessages + + + Payload + + + + + + + 1 + + + + + EnableExperiment + + + InboundMessages + + + Payload + + + + + + + 1 + + + + + EndExperiment + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/Logging.bonsai b/src/Extensions/Logging.bonsai new file mode 100644 index 0000000..41074d4 --- /dev/null +++ b/src/Extensions/Logging.bonsai @@ -0,0 +1,635 @@ + + + + + + Logging + + + + Behavior + + + + + + + Modality + Behavior + + + + 1 + + + + + 1 + + + + Modality + + + HarpLogging + + + + HarpBehaviorEvents + + + Modality + + + + + + + + + + + + + + RigSchema + + + IsSatellite + + + + Source1 + + + IsSatellite + + + + + + + + + + + ComputerName + + + ZmqSatellite_{0} + it + + + + Behavior + + + + + + + + 1 + + + + + + + + + + Behavior + + + + + + + + + + + + + + + + + + + + + + HarpCommandsLogging + + + + HarpBehaviorEvents + + + + Timestamp + false + + + + HarpSeconds + + + HarpBehaviorCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + + + + + + + + Behavior + HarpCommands/Behavior + + + + + + + + + + + + + + + + + + RigSchema + + + it.IsSatellite + it.IsSatellite + + + + + + SoftwareEvents + + + + SoftwareEvent + + + + TaskPoolScheduler + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + SoftwareEvents + LoggingRootPath + + + + + Metadata + + + + Repository + + + Head + + + + RepositoryStatus + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + RigSchema + + + it.IsSatellite + it.IsSatellite + + + + + + Other + + + + RigSchema + + + IsSatellite + + + + Source1 + + + IsSatellite + + + + + + + + + + + ComputerName + + + Logs_{0} + it + + + + Logs + + + + + + + + 1 + + + + DeviceName + + + ConfigSchemaLogging + + + + SubjectSchema + + + + None + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + session_output + + + RigSchema + + + + None + + + + Modality + + + + + + + + LoggingRootPath + + Config + rig_output + + + RawRigSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + rig_input + json + + + RawSessionSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + session_input + json + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logs + + + + EndExperiment + + + + ExperimentCompleted + + + + + SoftwareEvent + + + + HarpTimestampSource + + + + + + + + + + + + + None + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + + EndSession + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BehaviorVideos + + + + + + + Modality + BehaviorVideos + + + + 1 + + + + + 1 + + + + Modality + + + TriggeredCamerasStreams + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/Main.bonsai b/src/Extensions/Main.bonsai new file mode 100644 index 0000000..2bc0990 --- /dev/null +++ b/src/Extensions/Main.bonsai @@ -0,0 +1,1217 @@ + + + + + + Source1 + + + Main + + + + Init + + + + + ../. + + + + Repository + + + SubjectSchema + + + + + + + + + + + LoggingRootPath + + + + 1 + + + + CompoundRootPath + + + + message_protocol + + + + + 1 + + + + MessageProtocolZmqTopic + + + + harp + + + + + 1 + + + + HarpZmqTopic + + + + false + + + + + 1 + + + + SaveRawVideo + + + SoftwareEvent + + + EndExperiment + + + + false + + + + IsExperimentRunning + + + EnableExperiment + + + StartLogging + + + + true + + + + IsExperimentRunning + + + StartLogging + + + StartLogging + + + + PT1S + + + + StartExperiment + + + + false + + + + + 1 + + + + IsExperimentRunning + + + IsRepoClean + + + + Repository + + + + false + + + + + SubjectSchema + + + AllowDirtyRepo + + + + + + AllowDirty? + Item2 ? False : Item1 + + + + + + Source1 + + + + + + + + + + + Repository is not clean! Please discard all local changes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hardware + + + + + + HarpBehaviorEvents + + + + Timestamp + false + + + + HarpTimestampSource + + + ControllersInitialized + + + + + + RigSchema + + + ExpectedControllers + (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) + + + + + + + + + + Source1 + + + + + + + + + + StartExperiment + + + + + + + + + OutboundMessages + + + NetworkCommunication + + + + RigSchema + + + ZmqConnection + + + ZmqConnection + + + + PT0S + PT1S + + + + + + + RigSchema + + + RigName + + + + + + + + + Event + + + + OutboundMessages + + + Source1 + + + + None + + + + ZmqConnection + + + + + + + + MessageProtocolZmqTopic + + + + + + + + + tcp://localhost:5557 + message_protocol + + + + InboundMessages + + + IsRequest + + + + Source1 + + + MessageType + + + + Request + + + + + + + + + + + + + Payload + + + + + + + 1 + + + + + EnableExperiment + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + OutboundMessages + + + ZmqConnection + + + + + + + + MessageProtocolZmqTopic + + + + + + + + + tcp://localhost:5557 + message_protocol + + + + Last + + + + + + InboundMessages + + + + InboundMessages + + + IsRequest + + + + Source1 + + + MessageType + + + + Request + + + + + + + + + + + + + Payload + + + + + + + 1 + + + + + EndExperiment + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + OutboundMessages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + InboundMessages + + + + + + + + + + + + + + + + + + + + + + SubjectSchema + + + SkipHardwareValidation + + + + + + + Source1 + + + + + + + + + + + + + Logging + + + + Behavior + + + + + + + Modality + Behavior + + + + 1 + + + + + 1 + + + + Modality + + + HarpLogging + + + + HarpBehaviorEvents + + + Modality + + + + + + + + + + + + + + + Behavior + Behavior + + + + + + + + + + + + + HarpCommandsLogging + + + + HarpBehaviorEvents + + + + Timestamp + false + + + + HarpSeconds + + + HarpBehaviorCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + + + + + + + + Behavior + HarpCommands/Behavior + + + + + + + + + + + + + + + + + + SoftwareEvents + + + + SoftwareEvent + + + + TaskPoolScheduler + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + SoftwareEvents + LoggingRootPath + + + + + Metadata + + + + Repository + + + Head + + + + RepositoryStatus + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + Other + + + + + Logs + + + + + 1 + + + + DeviceName + + + ConfigSchemaLogging + + + + SubjectSchema + + + + None + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + session_output + + + RigSchema + + + + None + + + + Modality + + + + + + + + LoggingRootPath + + Config + rig_output + + + RawRigSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + rig_input + json + + + RawSessionSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + session_input + json + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logs + + + + EndExperiment + + + + ExperimentCompleted + + + + + SoftwareEvent + + + + HarpTimestampSource + + + + + + + + + + + + + None + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + + EndSession + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BehaviorVideos + + + + + + + Modality + BehaviorVideos + + + + 1 + + + + + 1 + + + + Modality + + + TriggeredCamerasStreams + + + + + + + + + + + + + + + + + + + + + + EndExperiment + + + + PT2S + + + + + + + StartLogging + + + + + + + 0 + + + + + JustFrames + true + + + + + + EndExperiment + + + + 1 + + + + EndRoutine + + + + Source1 + + + + 1 + + + + + + + + + + + + + PT2S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/TryParseRegisteredMessage.cs b/src/Extensions/TryParseRegisteredMessage.cs new file mode 100644 index 0000000..36ea778 --- /dev/null +++ b/src/Extensions/TryParseRegisteredMessage.cs @@ -0,0 +1,32 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using NetMQ; +using AindJustFramesSchemas.MessageProtocol; + +[Combinator] +[Description("Tries to parse NetMQFrame as RegisteredMessages and filters out invalid messages")] +[WorkflowElementCategory(ElementCategory.Combinator)] +public class TryParseRegisteredMessages +{ + public IObservable Process(IObservable source) + { + return source + .Select(frame => frame.ConvertToString()) + .Select(messageString => + { + try + { + return Newtonsoft.Json.JsonConvert.DeserializeObject(messageString); + } + catch + { + Console.WriteLine("Failed to parse message: " + messageString); + return null; + } + }) + .Where(msg => msg != null); + } +} diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai index 691ba39..058b03d 100644 --- a/src/Extensions/Visualizers.bonsai +++ b/src/Extensions/Visualizers.bonsai @@ -50,15 +50,7 @@ - StartLogging - - - - true - - - - IsExperimentRunning + EnableExperiment @@ -67,8 +59,6 @@ - - @@ -97,22 +87,12 @@ EndExperiment - - - false - - - - IsExperimentRunning - - - diff --git a/src/aind_behavior_just_frames/message_protocol.py b/src/aind_behavior_just_frames/message_protocol.py new file mode 100644 index 0000000..55f4ffe --- /dev/null +++ b/src/aind_behavior_just_frames/message_protocol.py @@ -0,0 +1,45 @@ +from typing import Annotated, Any, Literal, Union + +from aind_behavior_services.message_protocol import HeartbeatPayload, LogPayload, _Message +from aind_behavior_just_frames.rig import SatelliteRig +from aind_behavior_services.session import AindBehaviorSessionModel +from pydantic import BaseModel, ConfigDict, Field, RootModel, create_model + +## This api is experimental and subject to change! + +# ================================================================================ +# Create custom messages for this platform +class StartPayload(BaseModel): + payload_type: Literal["Start"] = "Start" + +class StopPayload(BaseModel): + payload_type: Literal["Stop"] = "Stop" + +# ================================================================================ +# Register payloads into a protocol +class RegisteredPayload(RootModel): + root: Annotated[ + Union[StartPayload, StopPayload, LogPayload, HeartbeatPayload], + Field(discriminator="payload_type", json_schema_extra={"x-abstract": True}), + ] + + +RegisteredMessages = create_model( + "RegisteredMessages", + __base__=_Message[RegisteredPayload], +) + + +class Message(RootModel): + root: _Message[Any] + + +class MessageProtocol(BaseModel): + """ + Container for the complete message protocol including all registered message types. + + """ + + model_config = ConfigDict(json_schema_extra={"x-abstract": True}) + registered_message: RegisteredMessages + message: Message \ No newline at end of file diff --git a/src/aind_behavior_just_frames/regenerate.py b/src/aind_behavior_just_frames/regenerate.py index d9cdd7c..dba241d 100644 --- a/src/aind_behavior_just_frames/regenerate.py +++ b/src/aind_behavior_just_frames/regenerate.py @@ -6,6 +6,7 @@ from aind_behavior_services.utils import BonsaiSgenSerializers, convert_pydantic_to_bonsai from aind_behavior_just_frames.rig import AindJustFramesRig +from aind_behavior_just_frames.message_protocol import MessageProtocol SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -29,6 +30,17 @@ def main(): cs_serializer=[BonsaiSgenSerializers.JSON], ) + convert_pydantic_to_bonsai( + MessageProtocol, + model_name="aind_physiology_fip_message_protocol", + root_element="Root", + cs_namespace=NAMESPACE_PREFIX + ".MessageProtocol", + json_schema_output_dir=SCHEMA_ROOT, + cs_output_dir=EXTENSIONS_ROOT, + cs_serializer=[BonsaiSgenSerializers.JSON], + ) + + if __name__ == "__main__": main() diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index c34fb2f..4014e8d 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -2,11 +2,37 @@ import aind_behavior_services.rig as rig from aind_behavior_services.rig import AindBehaviorRigModel -from pydantic import Field +from pydantic import BaseModel, Field, field_validator from . import __semver__ +class ZmqPubSub(BaseModel): + pub: rig.network.ZmqConnection = Field(description="ZMQ Publisher") + sub: rig.network.ZmqConnection = Field(description="ZMQ Subscriber") + +class SatelliteRig(AindBehaviorRigModel): + version: Literal[__semver__] = __semver__ + computer_name: str = Field(description="Remote Computer name") + zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") + triggered_camera_controller_0: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( + default=None, + description="Camera controller to triggered cameras. Will use Camera0 register as a trigger.", + ) + triggered_camera_controller_1: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( + default=None, + description="Camera controller to triggered cameras. Will use Camera1 register as a trigger.", + ) + is_satellite: bool = Field(default=True) + + @field_validator("zmq_connection", mode="after") + @classmethod + def validate_zmq_connection(cls, value: rig.network.ZmqConnection): + if isinstance(value, rig.network.ZmqConnection): + value.topic = "" + return value + + class AindJustFramesRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ triggered_camera_controller_0: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( @@ -21,6 +47,8 @@ class AindJustFramesRig(AindBehaviorRigModel): ..., description="Harp behavior board. Will be the source of triggers for the two camera controllers.", ) - harp_white_rabbit: Optional[rig.harp.HarpWhiteRabbit] = Field( - default=None, description="Harp White Rabbit for time synchronization." + satellite_rigs: list[SatelliteRig] = Field( + default_factory=list, min_length=1, description="List of satellite rigs." ) + is_satellite: bool = Field(default=False) + zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") diff --git a/src/main.bonsai b/src/main.bonsai index f822b28..5131c58 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -1,939 +1,85 @@  - - - - - - - LoadSchemas + ReadSchemas - - RawSessionSchema - - - + + - - 1 + + - SubjectSchema - - RawRigSchema - - - 1 - - RigSchema - - - - - - - - - - - - - Init - - - - - ../. - - - - Repository - - - SubjectSchema - - - - - - - - - - - LoggingRootPath + + - - 1 + + - CompoundRootPath - - - - false - - - - - 1 - - - - SaveRawVideo - - - SoftwareEvent - - - EndExperiment - - - StartLogging - - - StartLogging - - - - PT1S - + RawSessionSchema - - StartExperiment + + - - - false - + + SubjectSchema - - 1 - - - - IsExperimentRunning - - - IsRepoClean - - - - Repository - - - - false - - - - - SubjectSchema - - - AllowDirtyRepo - - - - - - AllowDirty? - Item2 ? False : Item1 - - - - - - Source1 - - - - - - - - - - - Repository is not clean! Please discard all local changes. - - - - - - - - - - - - - - - - + + + - + - - - - - - - - - - - Hardware - - - - - - HarpBehaviorEvents - - - - - - Seconds - - - HarpTimestampSource - - - ControllersInitialized - - - - - - RigSchema - - - ExpectedControllers - (it.TriggeredCameraController0==null ? 0 : 1)+(it.TriggeredCameraController1==null ? 0 : 1) - - - - - - - - - - Source1 - - - - - - - - - - StartExperiment - - - - - - - - - - - - - + - - - - - - - - - - SubjectSchema - - - SkipHardwareValidation - - - - - - - Source1 - - - - - - - - - - - - - Logging - - - - Behavior - - - - - - - Modality - Behavior - - - - 1 - - - - - 1 - - - - Modality - - - HarpLogging - - - - HarpBehaviorEvents - - - Modality - - - - - - - - - - - - - - - Behavior - Behavior - - - - - - - - - - - - - HarpCommandsLogging - - - - HarpBehaviorEvents - - - - Timestamp - false - - - - HarpSeconds - - - HarpBehaviorCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - - - - - - - - Behavior - HarpCommands/Behavior - - - - - - - - - - - - - - - - - - SoftwareEvents - - - - SoftwareEvent - - - - TaskPoolScheduler - - - - HarpTimestampSource - - - - TaskPoolScheduler - - - - - - - - - - - - - Modality - - - - - - - - SoftwareEvents - LoggingRootPath - - - - - Metadata - - - - Repository - - - Head - - - - RepositoryStatus - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - Other - - - - - Logs - - - - - 1 - - - - DeviceName - - - ConfigSchemaLogging - - - - SubjectSchema - - - - None - - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - Config - session_output - - - RigSchema - - - - None - - - - Modality - - - - - - - - LoggingRootPath - - Config - rig_output - - - RawRigSchema - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - Config - rig_input - json - - - RawSessionSchema - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - Config - session_input - json - - - RawTaskLogicSchema - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - Config - tasklogic_input - json - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Logs - - - - EndExperiment - - - - ExperimentCompleted - - - - - SoftwareEvent - - - - HarpTimestampSource - - - - - - - - - - - - - None - - - - Modality - - - - - - - - DeviceName - - - - - - - - LoggingRootPath - - - EndSession - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BehaviorVideos - - - - - - - Modality - BehaviorVideos - - - - 1 - - - - - 1 - - - - Modality - - - TriggeredCamerasStreams - - - - - - - - - - - - - - - - - - - - - - EndExperiment - - - - PT2S - - - - - - - StartLogging - - - - - - - 0 - - - - - JustFrames - true - - - - - - EndExperiment - - - - 1 - - - - EndRoutine - - - - Source1 - - - - 1 - - - - - - - + - - PT2S - + - - - - - - - - - - - - - - - - + + + \ No newline at end of file diff --git a/src/satellite.bonsai b/src/satellite.bonsai new file mode 100644 index 0000000..15cf421 --- /dev/null +++ b/src/satellite.bonsai @@ -0,0 +1,85 @@ + + + + + + + + + + ReadSchemas + + + + + + + + + + + + RawRigSchema + + + + + + RigSchema + + + + + + + + + + + RawSessionSchema + + + + + + SubjectSchema + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From bf0b5328be36491515612fd8d3364918c675657c Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:29:11 -0800 Subject: [PATCH 17/32] Target dev from Aind.Behavior.Services --- pyproject.toml | 2 +- .../aind_behavior_just_frames.json | 131 +- .../aind_physiology_fip_message_protocol.json | 922 ----- .../AindBehaviorJustFrames.Generated.cs | 243 +- ...dPhysiologyFipMessageProtocol.Generated.cs | 3375 +++-------------- src/aind_behavior_just_frames/rig.py | 1 - uv.lock | 518 +-- 7 files changed, 899 insertions(+), 4293 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 08a6eb9..5add741 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.5.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.12, <0.13", + "aind_behavior_services @git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@feat-update-session", "pydantic-settings" ] diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index e783611..8d25f0e 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -3,14 +3,14 @@ "AindBehaviorSessionModel": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.12.3", + "default": "0.13.0-rc0", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" }, "version": { - "const": "0.12.3", - "default": "0.12.3", + "const": "0.13.0-rc0", + "default": "0.13.0-rc0", "title": "Version", "type": "string" }, @@ -42,11 +42,6 @@ "title": "Date", "type": "string" }, - "root_path": { - "description": "Root path where data will be logged", - "title": "Root Path", - "type": "string" - }, "session_name": { "default": null, "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", @@ -65,13 +60,6 @@ "title": "Subject", "type": "string" }, - "experiment_version": { - "default": "", - "deprecated": true, - "description": "Version of the experiment", - "title": "Experiment Version", - "type": "string" - }, "notes": { "default": null, "description": "Notes about the experiment", @@ -112,7 +100,6 @@ } }, "required": [ - "root_path", "subject" ], "title": "AindBehaviorSessionModel", @@ -121,7 +108,7 @@ "AindJustFramesRig": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.12.3", + "default": "0.13.0-rc0", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -142,6 +129,12 @@ "title": "Rig Name", "type": "string" }, + "data_directory": { + "description": "Directory where data will be saved to", + "format": "path", + "title": "Data Directory", + "type": "string" + }, "triggered_camera_controller_0": { "default": null, "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", @@ -191,6 +184,7 @@ }, "required": [ "rig_name", + "data_directory", "harp_behavior", "zmq_connection" ], @@ -210,34 +204,14 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, + "name": { "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] + "title": "Name", + "type": "string" }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -271,6 +245,7 @@ } }, "required": [ + "name", "cameras" ], "title": "CameraController[SpinnakerCamera]", @@ -284,34 +259,14 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, + "name": { "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] + "title": "Name", + "type": "string" }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -347,12 +302,14 @@ } }, "required": [ + "name", "port_name" ], "title": "HarpBehavior", "type": "object" }, "Rect": { + "description": "Represents a rectangle defined by its top-left corner, width, and height.", "properties": { "x": { "default": 0, @@ -389,7 +346,7 @@ "SatelliteRig": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.12.3", + "default": "0.13.0-rc0", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -410,6 +367,12 @@ "title": "Rig Name", "type": "string" }, + "data_directory": { + "description": "Directory where data will be saved to", + "format": "path", + "title": "Data Directory", + "type": "string" + }, "zmq_connection": { "$ref": "#/$defs/ZmqPubSub", "description": "ZMQ connection for communication." @@ -447,48 +410,29 @@ "required": [ "computer_name", "rig_name", + "data_directory", "zmq_connection" ], "title": "SatelliteRig", "type": "object" }, "SpinnakerCamera": { + "description": "Spinnaker camera device configuration.", "properties": { "device_type": { "const": "SpinnakerCamera", "default": "SpinnakerCamera", - "description": "Device type", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, + "name": { "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] + "title": "Name", + "type": "string" }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -596,12 +540,14 @@ } }, "required": [ + "name", "serial_number" ], "title": "SpinnakerCamera", "type": "object" }, "SpinnakerCameraAdcBitDepth": { + "description": "ADC bit depth options for Spinnaker cameras.", "enum": [ 0, 1, @@ -616,6 +562,7 @@ ] }, "SpinnakerCameraPixelFormat": { + "description": "Pixel format options for Spinnaker cameras.", "enum": [ 0, 1, @@ -929,6 +876,7 @@ ] }, "VideoWriterFfmpeg": { + "description": "FFMPEG video writer configuration.", "properties": { "video_writer_type": { "const": "FFMPEG", @@ -966,6 +914,7 @@ "type": "object" }, "VideoWriterOpenCv": { + "description": "OpenCV video writer configuration.", "properties": { "video_writer_type": { "const": "OPENCV", diff --git a/src/DataSchemas/aind_physiology_fip_message_protocol.json b/src/DataSchemas/aind_physiology_fip_message_protocol.json index c2009cf..b1b45bf 100644 --- a/src/DataSchemas/aind_physiology_fip_message_protocol.json +++ b/src/DataSchemas/aind_physiology_fip_message_protocol.json @@ -1,202 +1,5 @@ { "$defs": { - "AindBehaviorSessionModel": { - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.12.3", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "version": { - "const": "0.12.3", - "default": "0.12.3", - "title": "Version", - "type": "string" - }, - "experiment": { - "default": null, - "description": "Name of the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Experiment" - }, - "experimenter": { - "default": [], - "description": "Name of the experimenter", - "items": { - "type": "string" - }, - "title": "Experimenter", - "type": "array" - }, - "date": { - "description": "Date of the experiment", - "format": "date-time", - "title": "Date", - "type": "string" - }, - "root_path": { - "description": "Root path where data will be logged", - "title": "Root Path", - "type": "string" - }, - "session_name": { - "default": null, - "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Name" - }, - "subject": { - "description": "Name of the subject", - "title": "Subject", - "type": "string" - }, - "experiment_version": { - "default": "", - "deprecated": true, - "description": "Version of the experiment", - "title": "Experiment Version", - "type": "string" - }, - "notes": { - "default": null, - "description": "Notes about the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - }, - "commit_hash": { - "default": null, - "description": "Commit hash of the repository", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Commit Hash" - }, - "allow_dirty_repo": { - "default": false, - "description": "Allow running from a dirty repository", - "title": "Allow Dirty Repo", - "type": "boolean" - }, - "skip_hardware_validation": { - "default": false, - "description": "Skip hardware validation", - "title": "Skip Hardware Validation", - "type": "boolean" - } - }, - "required": [ - "root_path", - "subject" - ], - "title": "AindBehaviorSessionModel", - "type": "object" - }, - "BaseModel": { - "properties": {}, - "title": "BaseModel", - "type": "object" - }, - "CameraController_SpinnakerCamera_": { - "properties": { - "device_type": { - "const": "CameraController", - "default": "CameraController", - "title": "Device Type", - "type": "string" - }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "calibration": { - "default": null, - "description": "Calibration", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "cameras": { - "additionalProperties": { - "$ref": "#/$defs/SpinnakerCamera" - }, - "description": "Cameras to be instantiated", - "title": "Cameras", - "type": "object" - }, - "frame_rate": { - "default": 30, - "description": "Frame rate of the trigger to all cameras", - "oneOf": [ - { - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Frame Rate" - } - }, - "required": [ - "cameras" - ], - "title": "CameraController[SpinnakerCamera]", - "type": "object" - }, "HeartbeatPayload": { "description": "Payload for heartbeat messages indicating system health status.\n\nHeartbeat messages are used to monitor the health and availability\nof system components. They include a status indicator and optional\ncontext information.\n\nAttributes:\n context: Optional additional data about the system state\n status: Current health status of the component\n\nExamples:\n ```python\n heartbeat = HeartbeatPayload(\n status=HeartbeatStatus.OK,\n context={\"cpu_usage\": 0.25, \"memory_usage\": 0.60}\n )\n print(heartbeat.status) # HeartbeatStatus.OK\n\n warning_heartbeat = HeartbeatPayload(\n status=HeartbeatStatus.WARNING,\n context={\"disk_space_low\": True}\n )\n ```", "properties": { @@ -330,40 +133,6 @@ "title": "MessageType", "type": "string" }, - "Rect": { - "properties": { - "x": { - "default": 0, - "description": "X coordinate of the top-left corner", - "minimum": 0, - "title": "X", - "type": "integer" - }, - "y": { - "default": 0, - "description": "Y coordinate of the top-left corner", - "minimum": 0, - "title": "Y", - "type": "integer" - }, - "width": { - "default": 0, - "description": "Width of the rectangle", - "minimum": 0, - "title": "Width", - "type": "integer" - }, - "height": { - "default": 0, - "description": "Height of the rectangle", - "minimum": 0, - "title": "Height", - "type": "integer" - } - }, - "title": "Rect", - "type": "object" - }, "RegisteredMessages": { "properties": { "message_type": { @@ -445,8 +214,6 @@ "mapping": { "HeartbeatPayload": "#/$defs/HeartbeatPayload", "LogPayload": "#/$defs/LogPayload", - "SatelliteRig": "#/$defs/SatelliteRigPayload", - "SatelliteSession": "#/$defs/SatelliteSessionPayload", "Start": "#/$defs/StartPayload", "Stop": "#/$defs/StopPayload" }, @@ -459,12 +226,6 @@ { "$ref": "#/$defs/StopPayload" }, - { - "$ref": "#/$defs/SatelliteRigPayload" - }, - { - "$ref": "#/$defs/SatelliteSessionPayload" - }, { "$ref": "#/$defs/LogPayload" }, @@ -475,569 +236,6 @@ "title": "RegisteredPayload", "x-abstract": true }, - "SatelliteRig": { - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.12.3", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "version": { - "const": "0.5.0-rc0", - "default": "0.5.0-rc0", - "title": "Version", - "type": "string" - }, - "computer_name": { - "description": "Remote Computer name", - "title": "Computer Name", - "type": "string" - }, - "rig_name": { - "description": "Rig name", - "title": "Rig Name", - "type": "string" - }, - "zmq_connection": { - "$ref": "#/$defs/ZmqPubSub", - "description": "ZMQ connection for communication." - }, - "triggered_camera_controller_0": { - "default": null, - "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", - "oneOf": [ - { - "$ref": "#/$defs/CameraController_SpinnakerCamera_" - }, - { - "type": "null" - } - ] - }, - "triggered_camera_controller_1": { - "default": null, - "description": "Camera controller to triggered cameras. Will use Camera1 register as a trigger.", - "oneOf": [ - { - "$ref": "#/$defs/CameraController_SpinnakerCamera_" - }, - { - "type": "null" - } - ] - }, - "is_satellite": { - "default": true, - "title": "Is Satellite", - "type": "boolean" - } - }, - "required": [ - "computer_name", - "rig_name", - "zmq_connection" - ], - "title": "SatelliteRig", - "type": "object" - }, - "SatelliteRigPayload": { - "properties": { - "payload_type": { - "const": "SatelliteRig", - "default": "SatelliteRig", - "title": "Payload Type", - "type": "string" - }, - "rig": { - "$ref": "#/$defs/SatelliteRig", - "description": "Satellite Rig configuration." - } - }, - "required": [ - "rig" - ], - "title": "SatelliteRigPayload", - "type": "object" - }, - "SatelliteSessionPayload": { - "properties": { - "payload_type": { - "const": "SatelliteSession", - "default": "SatelliteSession", - "title": "Payload Type", - "type": "string" - }, - "session": { - "$ref": "#/$defs/AindBehaviorSessionModel", - "description": "Satellite session configuration." - } - }, - "required": [ - "session" - ], - "title": "SatelliteSessionPayload", - "type": "object" - }, - "SpinnakerCamera": { - "properties": { - "device_type": { - "const": "SpinnakerCamera", - "default": "SpinnakerCamera", - "description": "Device type", - "title": "Device Type", - "type": "string" - }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "calibration": { - "default": null, - "description": "Calibration", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, - "serial_number": { - "description": "Camera serial number", - "title": "Serial Number", - "type": "string" - }, - "binning": { - "default": 1, - "description": "Binning", - "minimum": 1, - "title": "Binning", - "type": "integer" - }, - "color_processing": { - "default": "Default", - "description": "Color processing", - "enum": [ - "Default", - "NoColorProcessing" - ], - "title": "Color Processing", - "type": "string" - }, - "exposure": { - "default": 1000, - "description": "Exposure time", - "minimum": 100, - "title": "Exposure", - "type": "integer" - }, - "gain": { - "default": 0, - "description": "Gain", - "minimum": 0, - "title": "Gain", - "type": "number" - }, - "gamma": { - "default": null, - "description": "Gamma. If None, will disable gamma correction.", - "oneOf": [ - { - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Gamma" - }, - "adc_bit_depth": { - "default": 0, - "description": "ADC bit depth. If None will be left as default.", - "oneOf": [ - { - "$ref": "#/$defs/SpinnakerCameraAdcBitDepth" - }, - { - "type": "null" - } - ] - }, - "pixel_format": { - "default": 0, - "description": "Pixel format. If None will be left as default.", - "oneOf": [ - { - "$ref": "#/$defs/SpinnakerCameraPixelFormat" - }, - { - "type": "null" - } - ] - }, - "region_of_interest": { - "$ref": "#/$defs/Rect", - "default": { - "x": 0, - "y": 0, - "width": 0, - "height": 0 - }, - "description": "Region of interest" - }, - "video_writer": { - "default": null, - "description": "Video writer. If not provided, no video will be saved.", - "oneOf": [ - { - "$ref": "#/$defs/VideoWriter" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "serial_number" - ], - "title": "SpinnakerCamera", - "type": "object" - }, - "SpinnakerCameraAdcBitDepth": { - "enum": [ - 0, - 1, - 2 - ], - "title": "SpinnakerCameraAdcBitDepth", - "type": "integer", - "x-enumNames": [ - "Adc8bit", - "Adc10bit", - "Adc12bit" - ] - }, - "SpinnakerCameraPixelFormat": { - "enum": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143 - ], - "title": "SpinnakerCameraPixelFormat", - "type": "integer", - "x-enumNames": [ - "Mono8", - "Mono16", - "Rgb8packed", - "Bayergr8", - "Bayerrg8", - "Bayergb8", - "Bayerbg8", - "Bayergr16", - "Bayerrg16", - "Bayergb16", - "Bayerbg16", - "Mono12packed", - "Bayergr12packed", - "Bayerrg12packed", - "Bayergb12packed", - "Bayerbg12packed", - "Yuv411packed", - "Yuv422packed", - "Yuv444packed", - "Mono12p", - "Bayergr12p", - "Bayerrg12p", - "Bayergb12p", - "Bayerbg12p", - "Ycbcr8", - "Ycbcr4228", - "Ycbcr4118", - "Bgr8", - "Bgra8", - "Mono10packed", - "Bayergr10packed", - "Bayerrg10packed", - "Bayergb10packed", - "Bayerbg10packed", - "Mono10p", - "Bayergr10p", - "Bayerrg10p", - "Bayergb10p", - "Bayerbg10p", - "Mono1p", - "Mono2p", - "Mono4p", - "Mono8s", - "Mono10", - "Mono12", - "Mono14", - "Mono16s", - "Mono32f", - "Bayerbg10", - "Bayerbg12", - "Bayergb10", - "Bayergb12", - "Bayergr10", - "Bayergr12", - "Bayerrg10", - "Bayerrg12", - "Rgba8", - "Rgba10", - "Rgba10p", - "Rgba12", - "Rgba12p", - "Rgba14", - "Rgba16", - "Rgb8", - "Rgb8Planar", - "Rgb10", - "Rgb10Planar", - "Rgb10p", - "Rgb10p32", - "Rgb12", - "Rgb12Planar", - "Rgb12p", - "Rgb14", - "Rgb16", - "Rgb16s", - "Rgb32f", - "Rgb16Planar", - "Rgb565p", - "Bgra10", - "Bgra10p", - "Bgra12", - "Bgra12p", - "Bgra14", - "Bgra16", - "Rgba32f", - "Bgr10", - "Bgr10p", - "Bgr12", - "Bgr12p", - "Bgr14", - "Bgr16", - "Bgr565p", - "R8", - "R10", - "R12", - "R16", - "G8", - "G10", - "G12", - "G16", - "B8", - "B10", - "B12", - "B16", - "Coord3dAbc8", - "Coord3dAbc8Planar", - "Coord3dAbc10p", - "Coord3dAbc10pPlanar", - "Coord3dAbc12p", - "Coord3dAbc12pPlanar", - "Coord3dAbc16", - "Coord3dAbc16Planar", - "Coord3dAbc32f", - "Coord3dAbc32fPlanar", - "Coord3dAc8", - "Coord3dAc8Planar", - "Coord3dAc10p", - "Coord3dAc10pPlanar", - "Coord3dAc12p", - "Coord3dAc12pPlanar", - "Coord3dAc16", - "Coord3dAc16Planar", - "Coord3dAc32f", - "Coord3dAc32fPlanar", - "Coord3dA8", - "Coord3dA10p", - "Coord3dA12p", - "Coord3dA16", - "Coord3dA32f", - "Coord3dB8", - "Coord3dB10p", - "Coord3dB12p", - "Coord3dB16", - "Coord3dB32f", - "Coord3dC8", - "Coord3dC10p", - "Coord3dC12p", - "Coord3dC16", - "Coord3dC32f", - "Confidence1", - "Confidence1p", - "Confidence8", - "Confidence16", - "Confidence32f" - ] - }, "StartPayload": { "properties": { "payload_type": { @@ -1062,126 +260,6 @@ "title": "StopPayload", "type": "object" }, - "VideoWriter": { - "discriminator": { - "mapping": { - "FFMPEG": "#/$defs/VideoWriterFfmpeg", - "OPENCV": "#/$defs/VideoWriterOpenCv" - }, - "propertyName": "video_writer_type" - }, - "oneOf": [ - { - "$ref": "#/$defs/VideoWriterFfmpeg" - }, - { - "$ref": "#/$defs/VideoWriterOpenCv" - } - ] - }, - "VideoWriterFfmpeg": { - "properties": { - "video_writer_type": { - "const": "FFMPEG", - "default": "FFMPEG", - "title": "Video Writer Type", - "type": "string" - }, - "frame_rate": { - "default": 30, - "description": "Encoding frame rate", - "minimum": 0, - "title": "Frame Rate", - "type": "integer" - }, - "container_extension": { - "default": "mp4", - "description": "Container extension", - "title": "Container Extension", - "type": "string" - }, - "output_arguments": { - "default": "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M", - "description": "Output arguments", - "title": "Output Arguments", - "type": "string" - }, - "input_arguments": { - "default": "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear", - "description": "Input arguments", - "title": "Input Arguments", - "type": "string" - } - }, - "title": "VideoWriterFfmpeg", - "type": "object" - }, - "VideoWriterOpenCv": { - "properties": { - "video_writer_type": { - "const": "OPENCV", - "default": "OPENCV", - "title": "Video Writer Type", - "type": "string" - }, - "frame_rate": { - "default": 30, - "description": "Encoding frame rate", - "minimum": 0, - "title": "Frame Rate", - "type": "integer" - }, - "container_extension": { - "default": "avi", - "description": "Container extension", - "title": "Container Extension", - "type": "string" - }, - "four_cc": { - "default": "FMP4", - "description": "Four character code", - "title": "Four Cc", - "type": "string" - } - }, - "title": "VideoWriterOpenCv", - "type": "object" - }, - "ZmqConnection": { - "properties": { - "connection_string": { - "default": "@tcp://localhost:5556", - "description": "The connection string for the ZMQ socket.", - "title": "Connection String", - "type": "string" - }, - "topic": { - "default": "", - "title": "Topic", - "type": "string" - } - }, - "title": "ZmqConnection", - "type": "object" - }, - "ZmqPubSub": { - "properties": { - "pub": { - "$ref": "#/$defs/ZmqConnection", - "description": "ZMQ Publisher" - }, - "sub": { - "$ref": "#/$defs/ZmqConnection", - "description": "ZMQ Subscriber" - } - }, - "required": [ - "pub", - "sub" - ], - "title": "ZmqPubSub", - "type": "object" - }, "_Message_Any_": { "properties": { "message_type": { diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index 22bb3b9..c803a5e 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -25,14 +25,10 @@ public partial class AindBehaviorSessionModel private System.DateTimeOffset _date; - private string _rootPath; - private string _sessionName; private string _subject; - private string _experimentVersion; - private string _notes; private string _commitHash; @@ -43,10 +39,9 @@ public partial class AindBehaviorSessionModel public AindBehaviorSessionModel() { - _aindBehaviorServicesPkgVersion = "0.12.3"; - _version = "0.12.3"; + _aindBehaviorServicesPkgVersion = "0.13.0-rc0"; + _version = "0.13.0-rc0"; _experimenter = new System.Collections.Generic.List(); - _experimentVersion = ""; _allowDirtyRepo = false; _skipHardwareValidation = false; } @@ -58,10 +53,8 @@ protected AindBehaviorSessionModel(AindBehaviorSessionModel other) _experiment = other._experiment; _experimenter = other._experimenter; _date = other._date; - _rootPath = other._rootPath; _sessionName = other._sessionName; _subject = other._subject; - _experimentVersion = other._experimentVersion; _notes = other._notes; _commitHash = other._commitHash; _allowDirtyRepo = other._allowDirtyRepo; @@ -147,23 +140,6 @@ public System.DateTimeOffset Date } } - /// - /// Root path where data will be logged - /// - [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] - public string RootPath - { - get - { - return _rootPath; - } - set - { - _rootPath = value; - } - } - /// /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. /// @@ -199,23 +175,6 @@ public string Subject } } - /// - /// Version of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] - [System.ComponentModel.DescriptionAttribute("Version of the experiment")] - public string ExperimentVersion - { - get - { - return _experimentVersion; - } - set - { - _experimentVersion = value; - } - } - /// /// Notes about the experiment /// @@ -301,10 +260,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("Experiment = " + _experiment + ", "); stringBuilder.Append("Experimenter = " + _experimenter + ", "); stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("RootPath = " + _rootPath + ", "); stringBuilder.Append("SessionName = " + _sessionName + ", "); stringBuilder.Append("Subject = " + _subject + ", "); - stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); stringBuilder.Append("Notes = " + _notes + ", "); stringBuilder.Append("CommitHash = " + _commitHash + ", "); stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); @@ -341,6 +298,8 @@ public partial class AindJustFramesRig private string _rigName; + private string _dataDirectory; + private CameraControllerSpinnakerCamera _triggeredCameraController0; private CameraControllerSpinnakerCamera _triggeredCameraController1; @@ -355,7 +314,7 @@ public partial class AindJustFramesRig public AindJustFramesRig() { - _aindBehaviorServicesPkgVersion = "0.12.3"; + _aindBehaviorServicesPkgVersion = "0.13.0-rc0"; _version = "0.5.0-rc0"; _harpBehavior = new HarpBehavior(); _satelliteRigs = new System.Collections.Generic.List(); @@ -369,6 +328,7 @@ protected AindJustFramesRig(AindJustFramesRig other) _version = other._version; _computerName = other._computerName; _rigName = other._rigName; + _dataDirectory = other._dataDirectory; _triggeredCameraController0 = other._triggeredCameraController0; _triggeredCameraController1 = other._triggeredCameraController1; _harpBehavior = other._harpBehavior; @@ -437,6 +397,23 @@ public string RigName } } + /// + /// Directory where data will be saved to + /// + [Newtonsoft.Json.JsonPropertyAttribute("data_directory", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Directory where data will be saved to")] + public string DataDirectory + { + get + { + return _dataDirectory; + } + set + { + _dataDirectory = value; + } + } + /// /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. /// @@ -557,6 +534,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("Version = " + _version + ", "); stringBuilder.Append("ComputerName = " + _computerName + ", "); stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("DataDirectory = " + _dataDirectory + ", "); stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); @@ -633,9 +611,7 @@ public partial class CameraControllerSpinnakerCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; + private string _name; private BaseModel _calibration; @@ -652,8 +628,7 @@ public CameraControllerSpinnakerCamera() protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; + _name = other._name; _calibration = other._calibration; _cameras = other._cameras; _frameRate = other._frameRate; @@ -675,44 +650,26 @@ public string DeviceType /// /// Device name /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + public string Name { get { - return _additionalSettings; + return _name; } set { - _additionalSettings = value; + _name = value; } } /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -774,8 +731,7 @@ public System.IObservable Generate(Sys protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Name = " + _name + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("Cameras = " + _cameras + ", "); stringBuilder.Append("FrameRate = " + _frameRate); @@ -805,9 +761,7 @@ public partial class HarpBehavior private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; + private string _name; private BaseModel _calibration; @@ -826,8 +780,7 @@ public HarpBehavior() protected HarpBehavior(HarpBehavior other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; + _name = other._name; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -850,44 +803,26 @@ public string DeviceType /// /// Device name /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + public string Name { get { - return _deviceName; + return _name; } set { - _deviceName = value; + _name = value; } } /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -960,8 +895,7 @@ public System.IObservable Generate(System.IObservable + /// Represents a rectangle defined by its top-left corner, width, and height. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a rectangle defined by its top-left corner, width, and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Rect @@ -1130,6 +1068,8 @@ public partial class SatelliteRig private string _rigName; + private string _dataDirectory; + private ZmqPubSub _zmqConnection; private CameraControllerSpinnakerCamera _triggeredCameraController0; @@ -1140,7 +1080,7 @@ public partial class SatelliteRig public SatelliteRig() { - _aindBehaviorServicesPkgVersion = "0.12.3"; + _aindBehaviorServicesPkgVersion = "0.13.0-rc0"; _version = "0.5.0-rc0"; _zmqConnection = new ZmqPubSub(); _isSatellite = true; @@ -1152,6 +1092,7 @@ protected SatelliteRig(SatelliteRig other) _version = other._version; _computerName = other._computerName; _rigName = other._rigName; + _dataDirectory = other._dataDirectory; _zmqConnection = other._zmqConnection; _triggeredCameraController0 = other._triggeredCameraController0; _triggeredCameraController1 = other._triggeredCameraController1; @@ -1218,6 +1159,23 @@ public string RigName } } + /// + /// Directory where data will be saved to + /// + [Newtonsoft.Json.JsonPropertyAttribute("data_directory", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Directory where data will be saved to")] + public string DataDirectory + { + get + { + return _dataDirectory; + } + set + { + _dataDirectory = value; + } + } + /// /// ZMQ connection for communication. /// @@ -1301,6 +1259,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("Version = " + _version + ", "); stringBuilder.Append("ComputerName = " + _computerName + ", "); stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("DataDirectory = " + _dataDirectory + ", "); stringBuilder.Append("ZmqConnection = " + _zmqConnection + ", "); stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); @@ -1323,7 +1282,11 @@ public override string ToString() } + /// + /// Spinnaker camera device configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Spinnaker camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class SpinnakerCamera @@ -1331,9 +1294,7 @@ public partial class SpinnakerCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; + private string _name; private BaseModel _calibration; @@ -1372,8 +1333,7 @@ public SpinnakerCamera() protected SpinnakerCamera(SpinnakerCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; + _name = other._name; _calibration = other._calibration; _serialNumber = other._serialNumber; _binning = other._binning; @@ -1387,11 +1347,7 @@ protected SpinnakerCamera(SpinnakerCamera other) _videoWriter = other._videoWriter; } - /// - /// Device type - /// [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] public string DeviceType { get @@ -1407,44 +1363,26 @@ public string DeviceType /// /// Device name /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + public string Name { get { - return _deviceName; + return _name; } set { - _deviceName = value; + _name = value; } } /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -1646,8 +1584,7 @@ public System.IObservable Generate(System.IObservable< protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); + stringBuilder.Append("Name = " + _name + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); stringBuilder.Append("Binning = " + _binning + ", "); @@ -1677,6 +1614,9 @@ public override string ToString() } + /// + /// ADC bit depth options for Spinnaker cameras. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraAdcBitDepth { @@ -1692,6 +1632,9 @@ public enum SpinnakerCameraAdcBitDepth } + /// + /// Pixel format options for Spinnaker cameras. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraPixelFormat { @@ -2130,10 +2073,14 @@ public enum SpinnakerCameraPixelFormat } + /// + /// FFMPEG video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriter @@ -2177,7 +2124,11 @@ public override string ToString() } + /// + /// FFMPEG video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterFfmpeg : VideoWriter @@ -2301,7 +2252,11 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } + /// + /// OpenCV video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("OpenCV video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterOpenCv : VideoWriter diff --git a/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs b/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs index fae3503..74253e5 100644 --- a/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs +++ b/src/Extensions/AindPhysiologyFipMessageProtocol.Generated.cs @@ -9,2634 +9,365 @@ namespace AindJustFramesSchemas.MessageProtocol { #pragma warning disable // Disable all warnings + /// + /// Payload for heartbeat messages indicating system health status. + /// + ///Heartbeat messages are used to monitor the health and availability + ///of system components. They include a status indicator and optional + ///context information. + /// + ///Attributes: + /// context: Optional additional data about the system state + /// status: Current health status of the component + /// + ///Examples: + /// ```python + /// heartbeat = HeartbeatPayload( + /// status=HeartbeatStatus.OK, + /// context={"cpu_usage": 0.25, "memory_usage": 0.60} + /// ) + /// print(heartbeat.status) # HeartbeatStatus.OK + /// + /// warning_heartbeat = HeartbeatPayload( + /// status=HeartbeatStatus.WARNING, + /// context={"disk_space_low": True} + /// ) + /// ``` + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Payload for heartbeat messages indicating system health status. + + Heartbeat messages are used to monitor the health and availability + of system components. They include a status indicator and optional + context information. + + Attributes: + context: Optional additional data about the system state + status: Current health status of the component + + Examples: + ```python + heartbeat = HeartbeatPayload( + status=HeartbeatStatus.OK, + context={""cpu_usage"": 0.25, ""memory_usage"": 0.60} + ) + print(heartbeat.status) # HeartbeatStatus.OK + + warning_heartbeat = HeartbeatPayload( + status=HeartbeatStatus.WARNING, + context={""disk_space_low"": True} + ) + ```")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorSessionModel + public partial class HeartbeatPayload : RegisteredPayload { - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _experiment; - - private System.Collections.Generic.List _experimenter; - - private System.DateTimeOffset _date; - - private string _rootPath; - - private string _sessionName; - - private string _subject; - - private string _experimentVersion; - - private string _notes; - - private string _commitHash; - - private bool _allowDirtyRepo; - - private bool _skipHardwareValidation; - - public AindBehaviorSessionModel() - { - _aindBehaviorServicesPkgVersion = "0.12.3"; - _version = "0.12.3"; - _experimenter = new System.Collections.Generic.List(); - _experimentVersion = ""; - _allowDirtyRepo = false; - _skipHardwareValidation = false; - } - - protected AindBehaviorSessionModel(AindBehaviorSessionModel other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _experiment = other._experiment; - _experimenter = other._experimenter; - _date = other._date; - _rootPath = other._rootPath; - _sessionName = other._sessionName; - _subject = other._subject; - _experimentVersion = other._experimentVersion; - _notes = other._notes; - _commitHash = other._commitHash; - _allowDirtyRepo = other._allowDirtyRepo; - _skipHardwareValidation = other._skipHardwareValidation; - } + private object _context; - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } + private HeartbeatStatus _status; - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version + public HeartbeatPayload() { - get - { - return _version; - } - set - { - _version = value; - } } - /// - /// Name of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment")] - [System.ComponentModel.DescriptionAttribute("Name of the experiment")] - public string Experiment + protected HeartbeatPayload(HeartbeatPayload other) : + base(other) { - get - { - return _experiment; - } - set - { - _experiment = value; - } + _context = other._context; + _status = other._status; } /// - /// Name of the experimenter + /// Additional context for the heartbeat message. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] - [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] - public System.Collections.Generic.List Experimenter + [Newtonsoft.Json.JsonPropertyAttribute("context")] + [System.ComponentModel.DescriptionAttribute("Additional context for the heartbeat message.")] + public object Context { get { - return _experimenter; + return _context; } set { - _experimenter = value; + _context = value; } } /// - /// Date of the experiment + /// The status of the heartbeat message /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the experiment")] - public System.DateTimeOffset Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - /// - /// Root path where data will be logged - /// - [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] - public string RootPath - { - get - { - return _rootPath; - } - set - { - _rootPath = value; - } - } - - /// - /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. - /// - [Newtonsoft.Json.JsonPropertyAttribute("session_name")] - [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + - "t provided, it will be generated using subject and date.")] - public string SessionName - { - get - { - return _sessionName; - } - set - { - _sessionName = value; - } - } - - /// - /// Name of the subject - /// - [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the subject")] - public string Subject - { - get - { - return _subject; - } - set - { - _subject = value; - } - } - - /// - /// Version of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] - [System.ComponentModel.DescriptionAttribute("Version of the experiment")] - public string ExperimentVersion - { - get - { - return _experimentVersion; - } - set - { - _experimentVersion = value; - } - } - - /// - /// Notes about the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] - public string Notes + [Newtonsoft.Json.JsonPropertyAttribute("status", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The status of the heartbeat message")] + public HeartbeatStatus Status { get { - return _notes; + return _status; } set { - _notes = value; + _status = value; } } - /// - /// Commit hash of the repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] - [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] - public string CommitHash + public System.IObservable Generate() { - get - { - return _commitHash; - } - set - { - _commitHash = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HeartbeatPayload(this))); } - /// - /// Allow running from a dirty repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] - [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] - public bool AllowDirtyRepo + public System.IObservable Generate(System.IObservable source) { - get - { - return _allowDirtyRepo; - } - set - { - _allowDirtyRepo = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new HeartbeatPayload(this)); } - /// - /// Skip hardware validation - /// - [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] - [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] - public bool SkipHardwareValidation + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _skipHardwareValidation; - } - set + if (base.PrintMembers(stringBuilder)) { - _skipHardwareValidation = value; + stringBuilder.Append(", "); } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("Experiment = " + _experiment + ", "); - stringBuilder.Append("Experimenter = " + _experimenter + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("RootPath = " + _rootPath + ", "); - stringBuilder.Append("SessionName = " + _sessionName + ", "); - stringBuilder.Append("Subject = " + _subject + ", "); - stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); - stringBuilder.Append("Notes = " + _notes + ", "); - stringBuilder.Append("CommitHash = " + _commitHash + ", "); - stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); - stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); + stringBuilder.Append("Context = " + _context + ", "); + stringBuilder.Append("Status = " + _status); return true; } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } } + /// + /// Enumeration of possible heartbeat status values. + /// + ///Represents the health status of a system component, + ///with higher values indicating more severe issues. + /// + ///Examples: + /// ```python + /// HeartbeatStatus.OK # + /// HeartbeatStatus.CRITICAL > HeartbeatStatus.WARNING # True + /// int(HeartbeatStatus.ERROR) # 2 + /// ``` + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BaseModel + public enum HeartbeatStatus { - public BaseModel() - { - } - - protected BaseModel(BaseModel other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Ok = 0, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Warning = 1, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Error = 2, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Critical = 3, } + /// + /// Enumeration of log levels for the logging system. + /// + ///Follows standard Python logging levels with integer values + ///that allow for easy comparison and filtering. + /// + ///Examples: + /// ```python + /// LogLevel.ERROR > LogLevel.WARNING # True + /// LogLevel.DEBUG.value # 10 + /// str(LogLevel.INFO) # 'LogLevel.INFO' + /// ``` + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CameraControllerSpinnakerCamera + public enum LogLevel { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private System.Collections.Generic.Dictionary _cameras; - - private int? _frameRate; - - public CameraControllerSpinnakerCamera() - { - _deviceType = "CameraController"; - _cameras = new System.Collections.Generic.Dictionary(); - } - - protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _cameras = other._cameras; - _frameRate = other._frameRate; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - /// - /// Cameras to be instantiated - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.Dictionary Cameras - { - get - { - return _cameras; - } - set - { - _cameras = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Critical = 50, - /// - /// Frame rate of the trigger to all cameras - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate - { - get - { - return _frameRate; - } - set - { - _frameRate = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Error = 40, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Warning = 30, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Info = 20, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Cameras = " + _cameras + ", "); - stringBuilder.Append("FrameRate = " + _frameRate); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Debug = 10, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Notset = 0, } /// - /// Payload for heartbeat messages indicating system health status. + /// Payload for log messages containing logging information. /// - ///Heartbeat messages are used to monitor the health and availability - ///of system components. They include a status indicator and optional - ///context information. + ///This payload carries log data including the message content, + ///severity level, optional context, and application version. /// ///Attributes: - /// context: Optional additional data about the system state - /// status: Current health status of the component + /// message: The actual log message text + /// level: Severity level of the log entry + /// context: Optional additional data related to the log + /// application_version: Version of the application generating the log /// ///Examples: /// ```python - /// heartbeat = HeartbeatPayload( - /// status=HeartbeatStatus.OK, - /// context={"cpu_usage": 0.25, "memory_usage": 0.60} - /// ) - /// print(heartbeat.status) # HeartbeatStatus.OK - /// - /// warning_heartbeat = HeartbeatPayload( - /// status=HeartbeatStatus.WARNING, - /// context={"disk_space_low": True} + /// log_payload = LogPayload( + /// message="System startup complete", + /// level=LogLevel.INFO, + /// context={"operator": "John Doe"}, + /// application_version="1.0.0" /// ) + /// print(log_payload.level) # LogLevel.INFO /// ``` /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Payload for heartbeat messages indicating system health status. + [System.ComponentModel.DescriptionAttribute(@"Payload for log messages containing logging information. - Heartbeat messages are used to monitor the health and availability - of system components. They include a status indicator and optional - context information. + This payload carries log data including the message content, + severity level, optional context, and application version. Attributes: - context: Optional additional data about the system state - status: Current health status of the component + message: The actual log message text + level: Severity level of the log entry + context: Optional additional data related to the log + application_version: Version of the application generating the log Examples: ```python - heartbeat = HeartbeatPayload( - status=HeartbeatStatus.OK, - context={""cpu_usage"": 0.25, ""memory_usage"": 0.60} - ) - print(heartbeat.status) # HeartbeatStatus.OK - - warning_heartbeat = HeartbeatPayload( - status=HeartbeatStatus.WARNING, - context={""disk_space_low"": True} + log_payload = LogPayload( + message=""System startup complete"", + level=LogLevel.INFO, + context={""operator"": ""John Doe""}, + application_version=""1.0.0"" ) + print(log_payload.level) # LogLevel.INFO ```")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HeartbeatPayload : RegisteredPayload + public partial class LogPayload : RegisteredPayload { + private string _message; + + private LogLevel _level; + private object _context; - private HeartbeatStatus _status; + private string _applicationVersion; - public HeartbeatPayload() + public LogPayload() { + _level = AindJustFramesSchemas.MessageProtocol.LogLevel.Debug; } - protected HeartbeatPayload(HeartbeatPayload other) : + protected LogPayload(LogPayload other) : base(other) { + _message = other._message; + _level = other._level; _context = other._context; - _status = other._status; + _applicationVersion = other._applicationVersion; } /// - /// Additional context for the heartbeat message. + /// The message of the log /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("context")] - [System.ComponentModel.DescriptionAttribute("Additional context for the heartbeat message.")] - public object Context + [Newtonsoft.Json.JsonPropertyAttribute("message", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The message of the log")] + public string Message { get { - return _context; + return _message; } set { - _context = value; + _message = value; } } /// - /// The status of the heartbeat message + /// The level of the log message /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("status", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The status of the heartbeat message")] - public HeartbeatStatus Status + [Newtonsoft.Json.JsonPropertyAttribute("level")] + [System.ComponentModel.DescriptionAttribute("The level of the log message")] + public LogLevel Level { get { - return _status; + return _level; } set { - _status = value; + _level = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HeartbeatPayload(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new HeartbeatPayload(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Additional context for the log message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("context")] + [System.ComponentModel.DescriptionAttribute("Additional context for the log message")] + public object Context { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); - } - stringBuilder.Append("Context = " + _context + ", "); - stringBuilder.Append("Status = " + _status); - return true; - } - } - - - /// - /// Enumeration of possible heartbeat status values. - /// - ///Represents the health status of a system component, - ///with higher values indicating more severe issues. - /// - ///Examples: - /// ```python - /// HeartbeatStatus.OK # - /// HeartbeatStatus.CRITICAL > HeartbeatStatus.WARNING # True - /// int(HeartbeatStatus.ERROR) # 2 - /// ``` - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum HeartbeatStatus - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Ok = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Warning = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Error = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Critical = 3, - } - - - /// - /// Enumeration of log levels for the logging system. - /// - ///Follows standard Python logging levels with integer values - ///that allow for easy comparison and filtering. - /// - ///Examples: - /// ```python - /// LogLevel.ERROR > LogLevel.WARNING # True - /// LogLevel.DEBUG.value # 10 - /// str(LogLevel.INFO) # 'LogLevel.INFO' - /// ``` - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum LogLevel - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] - Critical = 50, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] - Error = 40, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] - Warning = 30, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] - Info = 20, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] - Debug = 10, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Notset = 0, - } - - - /// - /// Payload for log messages containing logging information. - /// - ///This payload carries log data including the message content, - ///severity level, optional context, and application version. - /// - ///Attributes: - /// message: The actual log message text - /// level: Severity level of the log entry - /// context: Optional additional data related to the log - /// application_version: Version of the application generating the log - /// - ///Examples: - /// ```python - /// log_payload = LogPayload( - /// message="System startup complete", - /// level=LogLevel.INFO, - /// context={"operator": "John Doe"}, - /// application_version="1.0.0" - /// ) - /// print(log_payload.level) # LogLevel.INFO - /// ``` - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Payload for log messages containing logging information. - - This payload carries log data including the message content, - severity level, optional context, and application version. - - Attributes: - message: The actual log message text - level: Severity level of the log entry - context: Optional additional data related to the log - application_version: Version of the application generating the log - - Examples: - ```python - log_payload = LogPayload( - message=""System startup complete"", - level=LogLevel.INFO, - context={""operator"": ""John Doe""}, - application_version=""1.0.0"" - ) - print(log_payload.level) # LogLevel.INFO - ```")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LogPayload : RegisteredPayload - { - - private string _message; - - private LogLevel _level; - - private object _context; - - private string _applicationVersion; - - public LogPayload() - { - _level = AindJustFramesSchemas.MessageProtocol.LogLevel.Debug; - } - - protected LogPayload(LogPayload other) : - base(other) - { - _message = other._message; - _level = other._level; - _context = other._context; - _applicationVersion = other._applicationVersion; - } - - /// - /// The message of the log - /// - [Newtonsoft.Json.JsonPropertyAttribute("message", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The message of the log")] - public string Message - { - get - { - return _message; - } - set - { - _message = value; - } - } - - /// - /// The level of the log message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("level")] - [System.ComponentModel.DescriptionAttribute("The level of the log message")] - public LogLevel Level - { - get - { - return _level; - } - set - { - _level = value; - } - } - - /// - /// Additional context for the log message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("context")] - [System.ComponentModel.DescriptionAttribute("Additional context for the log message")] - public object Context - { - get - { - return _context; - } - set - { - _context = value; - } - } - - /// - /// The version of the application - /// - [Newtonsoft.Json.JsonPropertyAttribute("application_version")] - [System.ComponentModel.DescriptionAttribute("The version of the application")] - public string ApplicationVersion - { - get - { - return _applicationVersion; - } - set - { - _applicationVersion = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogPayload(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new LogPayload(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Message = " + _message + ", "); - stringBuilder.Append("Level = " + _level + ", "); - stringBuilder.Append("Context = " + _context + ", "); - stringBuilder.Append("ApplicationVersion = " + _applicationVersion); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Message - { - - private MessageType _messageType; - - private int _protocolVersion; - - private System.DateTimeOffset? _timestamp; - - private object _payload; - - private string _processId; - - private string _hostname; - - private string _rigName; - - public Message() - { - _protocolVersion = 0; - } - - protected Message(Message other) - { - _messageType = other._messageType; - _protocolVersion = other._protocolVersion; - _timestamp = other._timestamp; - _payload = other._payload; - _processId = other._processId; - _hostname = other._hostname; - _rigName = other._rigName; - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] - public MessageType MessageType - { - get - { - return _messageType; - } - set - { - _messageType = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] - public int ProtocolVersion - { - get - { - return _protocolVersion; - } - set - { - _protocolVersion = value; - } - } - - /// - /// The timestamp of the message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] - public System.DateTimeOffset? Timestamp - { - get - { - return _timestamp; - } - set - { - _timestamp = value; - } - } - - /// - /// The payload of the message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The payload of the message")] - public object Payload - { - get - { - return _payload; - } - set - { - _payload = value; - } - } - - /// - /// Process that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Process that created the message")] - public string ProcessId - { - get - { - return _processId; - } - set - { - _processId = value; - } - } - - /// - /// Hostname that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] - public string Hostname - { - get - { - return _hostname; - } - set - { - _hostname = value; - } - } - - /// - /// Rig name that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] - public string RigName - { - get - { - return _rigName; - } - set - { - _rigName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Message(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Message(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("MessageType = " + _messageType + ", "); - stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); - stringBuilder.Append("Timestamp = " + _timestamp + ", "); - stringBuilder.Append("Payload = " + _payload + ", "); - stringBuilder.Append("ProcessId = " + _processId + ", "); - stringBuilder.Append("Hostname = " + _hostname + ", "); - stringBuilder.Append("RigName = " + _rigName); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Enumeration of possible message types in the protocol. - /// - ///Examples: - /// ```python - /// MessageType.REQUEST # 'request' - /// MessageType.REPLY # 'reply' - /// MessageType.EVENT # 'event' - /// ``` - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum MessageType - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="request")] - Request = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="reply")] - Reply = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="event")] - Event = 2, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rect - { - - private int _x; - - private int _y; - - private int _width; - - private int _height; - - public Rect() - { - _x = 0; - _y = 0; - _width = 0; - _height = 0; - } - - protected Rect(Rect other) - { - _x = other._x; - _y = other._y; - _width = other._width; - _height = other._height; - } - - /// - /// X coordinate of the top-left corner - /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] - public int X - { - get - { - return _x; - } - set - { - _x = value; - } - } - - /// - /// Y coordinate of the top-left corner - /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] - public int Y - { - get - { - return _y; - } - set - { - _y = value; - } - } - - /// - /// Width of the rectangle - /// - [Newtonsoft.Json.JsonPropertyAttribute("width")] - [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] - public int Width - { - get - { - return _width; - } - set - { - _width = value; - } - } - - /// - /// Height of the rectangle - /// - [Newtonsoft.Json.JsonPropertyAttribute("height")] - [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] - public int Height - { - get - { - return _height; - } - set - { - _height = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Width = " + _width + ", "); - stringBuilder.Append("Height = " + _height); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RegisteredMessages - { - - private MessageType _messageType; - - private int _protocolVersion; - - private System.DateTimeOffset? _timestamp; - - private RegisteredPayload _payload; - - private string _processId; - - private string _hostname; - - private string _rigName; - - public RegisteredMessages() - { - _protocolVersion = 0; - } - - protected RegisteredMessages(RegisteredMessages other) - { - _messageType = other._messageType; - _protocolVersion = other._protocolVersion; - _timestamp = other._timestamp; - _payload = other._payload; - _processId = other._processId; - _hostname = other._hostname; - _rigName = other._rigName; - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] - public MessageType MessageType - { - get - { - return _messageType; - } - set - { - _messageType = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] - public int ProtocolVersion - { - get - { - return _protocolVersion; - } - set - { - _protocolVersion = value; - } - } - - /// - /// The timestamp of the message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] - public System.DateTimeOffset? Timestamp - { - get - { - return _timestamp; - } - set - { - _timestamp = value; - } - } - - /// - /// The payload of the message - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The payload of the message")] - public RegisteredPayload Payload - { - get - { - return _payload; - } - set - { - _payload = value; - } - } - - /// - /// Process that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Process that created the message")] - public string ProcessId - { - get - { - return _processId; - } - set - { - _processId = value; - } - } - - /// - /// Hostname that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] - public string Hostname - { - get - { - return _hostname; - } - set - { - _hostname = value; - } - } - - /// - /// Rig name that created the message - /// - [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] - public string RigName - { - get - { - return _rigName; - } - set - { - _rigName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RegisteredMessages(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RegisteredMessages(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("MessageType = " + _messageType + ", "); - stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); - stringBuilder.Append("Timestamp = " + _timestamp + ", "); - stringBuilder.Append("Payload = " + _payload + ", "); - stringBuilder.Append("ProcessId = " + _processId + ", "); - stringBuilder.Append("Hostname = " + _hostname + ", "); - stringBuilder.Append("RigName = " + _rigName); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "payload_type")] - [JsonInheritanceAttribute("HeartbeatPayload", typeof(HeartbeatPayload))] - [JsonInheritanceAttribute("LogPayload", typeof(LogPayload))] - [JsonInheritanceAttribute("Start", typeof(StartPayload))] - [JsonInheritanceAttribute("Stop", typeof(StopPayload))] - [JsonInheritanceAttribute("SatelliteRig", typeof(SatelliteRigPayload))] - [JsonInheritanceAttribute("SatelliteSession", typeof(SatelliteSessionPayload))] - public abstract partial class RegisteredPayload - { - - protected RegisteredPayload() - { - } - - protected RegisteredPayload(RegisteredPayload other) - { - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SatelliteRig - { - - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _computerName; - - private string _rigName; - - private ZmqPubSub _zmqConnection; - - private CameraControllerSpinnakerCamera _triggeredCameraController0; - - private CameraControllerSpinnakerCamera _triggeredCameraController1; - - private bool _isSatellite; - - public SatelliteRig() - { - _aindBehaviorServicesPkgVersion = "0.12.3"; - _version = "0.5.0-rc0"; - _zmqConnection = new ZmqPubSub(); - _isSatellite = true; - } - - protected SatelliteRig(SatelliteRig other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _computerName = other._computerName; - _rigName = other._rigName; - _zmqConnection = other._zmqConnection; - _triggeredCameraController0 = other._triggeredCameraController0; - _triggeredCameraController1 = other._triggeredCameraController1; - _isSatellite = other._isSatellite; - } - - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version - { - get - { - return _version; - } - set - { - _version = value; - } - } - - /// - /// Remote Computer name - /// - [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Remote Computer name")] - public string ComputerName - { - get - { - return _computerName; - } - set - { - _computerName = value; - } - } - - /// - /// Rig name - /// - [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rig name")] - public string RigName - { - get - { - return _rigName; - } - set - { - _rigName = value; - } - } - - /// - /// ZMQ connection for communication. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] - public ZmqPubSub ZmqConnection - { - get - { - return _zmqConnection; - } - set - { - _zmqConnection = value; - } - } - - /// - /// Camera controller to triggered cameras. Will use Camera0 register as a trigger. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_0")] - [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera0 register as a trigger.")] - public CameraControllerSpinnakerCamera TriggeredCameraController0 - { - get - { - return _triggeredCameraController0; - } - set - { - _triggeredCameraController0 = value; - } - } - - /// - /// Camera controller to triggered cameras. Will use Camera1 register as a trigger. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller_1")] - [System.ComponentModel.DescriptionAttribute("Camera controller to triggered cameras. Will use Camera1 register as a trigger.")] - public CameraControllerSpinnakerCamera TriggeredCameraController1 - { - get - { - return _triggeredCameraController1; - } - set - { - _triggeredCameraController1 = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("is_satellite")] - public bool IsSatellite - { - get - { - return _isSatellite; - } - set - { - _isSatellite = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteRig(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteRig(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("ComputerName = " + _computerName + ", "); - stringBuilder.Append("RigName = " + _rigName + ", "); - stringBuilder.Append("ZmqConnection = " + _zmqConnection + ", "); - stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); - stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); - stringBuilder.Append("IsSatellite = " + _isSatellite); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SatelliteRigPayload : RegisteredPayload - { - - private SatelliteRig _rig; - - public SatelliteRigPayload() - { - _rig = new SatelliteRig(); - } - - protected SatelliteRigPayload(SatelliteRigPayload other) : - base(other) - { - _rig = other._rig; - } - - /// - /// Satellite Rig configuration. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rig", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Satellite Rig configuration.")] - public SatelliteRig Rig - { - get - { - return _rig; - } - set - { - _rig = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteRigPayload(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteRigPayload(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Rig = " + _rig); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SatelliteSessionPayload : RegisteredPayload - { - - private AindBehaviorSessionModel _session; - - public SatelliteSessionPayload() - { - _session = new AindBehaviorSessionModel(); - } - - protected SatelliteSessionPayload(SatelliteSessionPayload other) : - base(other) - { - _session = other._session; - } - - /// - /// Satellite session configuration. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("session", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Satellite session configuration.")] - public AindBehaviorSessionModel Session - { - get - { - return _session; - } - set - { - _session = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SatelliteSessionPayload(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SatelliteSessionPayload(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Session = " + _session); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SpinnakerCamera - { - - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private string _serialNumber; - - private int _binning; - - private SpinnakerCameraColorProcessing _colorProcessing; - - private int _exposure; - - private double _gain; - - private double? _gamma; - - private SpinnakerCameraAdcBitDepth? _adcBitDepth; - - private SpinnakerCameraPixelFormat? _pixelFormat; - - private Rect _regionOfInterest; - - private VideoWriter _videoWriter; - - public SpinnakerCamera() - { - _deviceType = "SpinnakerCamera"; - _binning = 1; - _colorProcessing = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraColorProcessing.Default; - _exposure = 1000; - _gain = 0D; - _adcBitDepth = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraAdcBitDepth.Adc8bit; - _pixelFormat = AindJustFramesSchemas.MessageProtocol.SpinnakerCameraPixelFormat.Mono8; - _regionOfInterest = new Rect(); - } - - protected SpinnakerCamera(SpinnakerCamera other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _serialNumber = other._serialNumber; - _binning = other._binning; - _colorProcessing = other._colorProcessing; - _exposure = other._exposure; - _gain = other._gain; - _gamma = other._gamma; - _adcBitDepth = other._adcBitDepth; - _pixelFormat = other._pixelFormat; - _regionOfInterest = other._regionOfInterest; - _videoWriter = other._videoWriter; - } - - /// - /// Device type - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - /// - /// Camera serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Camera serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Binning - /// - [Newtonsoft.Json.JsonPropertyAttribute("binning")] - [System.ComponentModel.DescriptionAttribute("Binning")] - public int Binning - { - get - { - return _binning; - } - set - { - _binning = value; - } - } - - /// - /// Color processing - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] - [System.ComponentModel.DescriptionAttribute("Color processing")] - public SpinnakerCameraColorProcessing ColorProcessing - { - get - { - return _colorProcessing; - } - set - { - _colorProcessing = value; - } - } - - /// - /// Exposure time - /// - [Newtonsoft.Json.JsonPropertyAttribute("exposure")] - [System.ComponentModel.DescriptionAttribute("Exposure time")] - public int Exposure - { - get - { - return _exposure; - } - set - { - _exposure = value; - } - } - - /// - /// Gain - /// - [Newtonsoft.Json.JsonPropertyAttribute("gain")] - [System.ComponentModel.DescriptionAttribute("Gain")] - public double Gain - { - get - { - return _gain; - } - set - { - _gain = value; - } - } - - /// - /// Gamma. If None, will disable gamma correction. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("gamma")] - [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] - public double? Gamma - { - get - { - return _gamma; - } - set - { - _gamma = value; - } - } - - /// - /// ADC bit depth. If None will be left as default. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] - [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] - public SpinnakerCameraAdcBitDepth? AdcBitDepth - { - get - { - return _adcBitDepth; - } - set - { - _adcBitDepth = value; - } - } - - /// - /// Pixel format. If None will be left as default. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] - [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] - public SpinnakerCameraPixelFormat? PixelFormat - { - get - { - return _pixelFormat; - } - set - { - _pixelFormat = value; - } - } - - /// - /// Region of interest - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] - [System.ComponentModel.DescriptionAttribute("Region of interest")] - public Rect RegionOfInterest - { - get - { - return _regionOfInterest; - } - set - { - _regionOfInterest = value; - } - } - - /// - /// Video writer. If not provided, no video will be saved. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] - [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] - public VideoWriter VideoWriter - { - get - { - return _videoWriter; - } - set - { - _videoWriter = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("Binning = " + _binning + ", "); - stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); - stringBuilder.Append("Exposure = " + _exposure + ", "); - stringBuilder.Append("Gain = " + _gain + ", "); - stringBuilder.Append("Gamma = " + _gamma + ", "); - stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); - stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); - stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); - stringBuilder.Append("VideoWriter = " + _videoWriter); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum SpinnakerCameraAdcBitDepth - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Adc8bit = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Adc10bit = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Adc12bit = 2, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum SpinnakerCameraPixelFormat - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Mono8 = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Mono16 = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Rgb8packed = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Bayergr8 = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] - Bayerrg8 = 4, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] - Bayergb8 = 5, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] - Bayerbg8 = 6, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] - Bayergr16 = 7, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] - Bayerrg16 = 8, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] - Bayergb16 = 9, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] - Bayerbg16 = 10, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] - Mono12packed = 11, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] - Bayergr12packed = 12, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] - Bayerrg12packed = 13, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] - Bayergb12packed = 14, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] - Bayerbg12packed = 15, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] - Yuv411packed = 16, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] - Yuv422packed = 17, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] - Yuv444packed = 18, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] - Mono12p = 19, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] - Bayergr12p = 20, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] - Bayerrg12p = 21, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] - Bayergb12p = 22, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] - Bayerbg12p = 23, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] - Ycbcr8 = 24, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] - Ycbcr4228 = 25, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] - Ycbcr4118 = 26, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] - Bgr8 = 27, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] - Bgra8 = 28, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] - Mono10packed = 29, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] - Bayergr10packed = 30, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] - Bayerrg10packed = 31, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] - Bayergb10packed = 32, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] - Bayerbg10packed = 33, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] - Mono10p = 34, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] - Bayergr10p = 35, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] - Bayerrg10p = 36, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] - Bayergb10p = 37, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] - Bayerbg10p = 38, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] - Mono1p = 39, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] - Mono2p = 40, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] - Mono4p = 41, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] - Mono8s = 42, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] - Mono10 = 43, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] - Mono12 = 44, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] - Mono14 = 45, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] - Mono16s = 46, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] - Mono32f = 47, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] - Bayerbg10 = 48, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] - Bayerbg12 = 49, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] - Bayergb10 = 50, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] - Bayergb12 = 51, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] - Bayergr10 = 52, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] - Bayergr12 = 53, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] - Bayerrg10 = 54, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] - Bayerrg12 = 55, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] - Rgba8 = 56, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] - Rgba10 = 57, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] - Rgba10p = 58, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] - Rgba12 = 59, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] - Rgba12p = 60, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] - Rgba14 = 61, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] - Rgba16 = 62, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] - Rgb8 = 63, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] - Rgb8Planar = 64, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] - Rgb10 = 65, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] - Rgb10Planar = 66, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] - Rgb10p = 67, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] - Rgb10p32 = 68, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] - Rgb12 = 69, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] - Rgb12Planar = 70, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] - Rgb12p = 71, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] - Rgb14 = 72, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] - Rgb16 = 73, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] - Rgb16s = 74, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] - Rgb32f = 75, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] - Rgb16Planar = 76, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] - Rgb565p = 77, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] - Bgra10 = 78, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] - Bgra10p = 79, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] - Bgra12 = 80, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] - Bgra12p = 81, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] - Bgra14 = 82, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] - Bgra16 = 83, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] - Rgba32f = 84, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] - Bgr10 = 85, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] - Bgr10p = 86, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] - Bgr12 = 87, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] - Bgr12p = 88, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] - Bgr14 = 89, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] - Bgr16 = 90, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] - Bgr565p = 91, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] - R8 = 92, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] - R10 = 93, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] - R12 = 94, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] - R16 = 95, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] - G8 = 96, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] - G10 = 97, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] - G12 = 98, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] - G16 = 99, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] - B8 = 100, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] - B10 = 101, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] - B12 = 102, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] - B16 = 103, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] - Coord3dAbc8 = 104, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] - Coord3dAbc8Planar = 105, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] - Coord3dAbc10p = 106, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] - Coord3dAbc10pPlanar = 107, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] - Coord3dAbc12p = 108, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] - Coord3dAbc12pPlanar = 109, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] - Coord3dAbc16 = 110, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] - Coord3dAbc16Planar = 111, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] - Coord3dAbc32f = 112, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] - Coord3dAbc32fPlanar = 113, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] - Coord3dAc8 = 114, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] - Coord3dAc8Planar = 115, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] - Coord3dAc10p = 116, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] - Coord3dAc10pPlanar = 117, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] - Coord3dAc12p = 118, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] - Coord3dAc12pPlanar = 119, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] - Coord3dAc16 = 120, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] - Coord3dAc16Planar = 121, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] - Coord3dAc32f = 122, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] - Coord3dAc32fPlanar = 123, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] - Coord3dA8 = 124, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] - Coord3dA10p = 125, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] - Coord3dA12p = 126, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] - Coord3dA16 = 127, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] - Coord3dA32f = 128, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] - Coord3dB8 = 129, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] - Coord3dB10p = 130, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] - Coord3dB12p = 131, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] - Coord3dB16 = 132, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] - Coord3dB32f = 133, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] - Coord3dC8 = 134, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] - Coord3dC10p = 135, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] - Coord3dC12p = 136, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] - Coord3dC16 = 137, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="138")] - Coord3dC32f = 138, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="139")] - Confidence1 = 139, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="140")] - Confidence1p = 140, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="141")] - Confidence8 = 141, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="142")] - Confidence16 = 142, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="143")] - Confidence32f = 143, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class StartPayload : RegisteredPayload - { - - public StartPayload() - { + return _context; + } + set + { + _context = value; + } } - protected StartPayload(StartPayload other) : - base(other) + /// + /// The version of the application + /// + [Newtonsoft.Json.JsonPropertyAttribute("application_version")] + [System.ComponentModel.DescriptionAttribute("The version of the application")] + public string ApplicationVersion { + get + { + return _applicationVersion; + } + set + { + _applicationVersion = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StartPayload(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogPayload(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new StartPayload(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new LogPayload(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return base.PrintMembers(stringBuilder); + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Message = " + _message + ", "); + stringBuilder.Append("Level = " + _level + ", "); + stringBuilder.Append("Context = " + _context + ", "); + stringBuilder.Append("ApplicationVersion = " + _applicationVersion); + return true; } } @@ -2644,374 +375,385 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class StopPayload : RegisteredPayload + public partial class Message { - public StopPayload() - { - } - - protected StopPayload(StopPayload other) : - base(other) - { - } + private MessageType _messageType; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StopPayload(this))); - } + private int _protocolVersion; - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new StopPayload(this)); - } + private System.DateTimeOffset? _timestamp; - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return base.PrintMembers(stringBuilder); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] - [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] - [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriter - { + private object _payload; - public VideoWriter() - { - } + private string _processId; - protected VideoWriter(VideoWriter other) - { - } + private string _hostname; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); - } + private string _rigName; - public System.IObservable Generate(System.IObservable source) + public Message() { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); + _protocolVersion = 0; } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected Message(Message other) { - return false; + _messageType = other._messageType; + _protocolVersion = other._protocolVersion; + _timestamp = other._timestamp; + _payload = other._payload; + _processId = other._processId; + _hostname = other._hostname; + _rigName = other._rigName; } - public override string ToString() + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] + public MessageType MessageType { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _messageType; + } + set + { + _messageType = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterFfmpeg : VideoWriter - { - - private int _frameRate; - - private string _containerExtension; - private string _outputArguments; - - private string _inputArguments; - - public VideoWriterFfmpeg() + [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] + public int ProtocolVersion { - _frameRate = 30; - _containerExtension = "mp4"; - _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; - _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; + get + { + return _protocolVersion; + } + set + { + _protocolVersion = value; + } } - protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : - base(other) + /// + /// The timestamp of the message + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] + public System.DateTimeOffset? Timestamp { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _outputArguments = other._outputArguments; - _inputArguments = other._inputArguments; + get + { + return _timestamp; + } + set + { + _timestamp = value; + } } /// - /// Encoding frame rate + /// The payload of the message /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The payload of the message")] + public object Payload { get { - return _frameRate; + return _payload; } set { - _frameRate = value; + _payload = value; } } /// - /// Container extension + /// Process that created the message /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension + [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Process that created the message")] + public string ProcessId { get { - return _containerExtension; + return _processId; } set { - _containerExtension = value; + _processId = value; } } /// - /// Output arguments + /// Hostname that created the message /// - [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] - [System.ComponentModel.DescriptionAttribute("Output arguments")] - public string OutputArguments + [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] + public string Hostname { get { - return _outputArguments; + return _hostname; } set { - _outputArguments = value; + _hostname = value; } } /// - /// Input arguments + /// Rig name that created the message /// - [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] - [System.ComponentModel.DescriptionAttribute("Input arguments")] - public string InputArguments + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] + public string RigName { get { - return _inputArguments; + return _rigName; } set { - _inputArguments = value; + _rigName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Message(this))); + } + + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new Message(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); + stringBuilder.Append("MessageType = " + _messageType + ", "); + stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); + stringBuilder.Append("Timestamp = " + _timestamp + ", "); + stringBuilder.Append("Payload = " + _payload + ", "); + stringBuilder.Append("ProcessId = " + _processId + ", "); + stringBuilder.Append("Hostname = " + _hostname + ", "); + stringBuilder.Append("RigName = " + _rigName); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); - stringBuilder.Append("InputArguments = " + _inputArguments); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } + /// + /// Enumeration of possible message types in the protocol. + /// + ///Examples: + /// ```python + /// MessageType.REQUEST # 'request' + /// MessageType.REPLY # 'reply' + /// MessageType.EVENT # 'event' + /// ``` + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum MessageType + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="request")] + Request = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="reply")] + Reply = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="event")] + Event = 2, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterOpenCv : VideoWriter + public partial class RegisteredMessages { - private int _frameRate; + private MessageType _messageType; + + private int _protocolVersion; + + private System.DateTimeOffset? _timestamp; + + private RegisteredPayload _payload; + + private string _processId; + + private string _hostname; - private string _containerExtension; + private string _rigName; - private string _fourCc; + public RegisteredMessages() + { + _protocolVersion = 0; + } - public VideoWriterOpenCv() + protected RegisteredMessages(RegisteredMessages other) { - _frameRate = 30; - _containerExtension = "avi"; - _fourCc = "FMP4"; + _messageType = other._messageType; + _protocolVersion = other._protocolVersion; + _timestamp = other._timestamp; + _payload = other._payload; + _processId = other._processId; + _hostname = other._hostname; + _rigName = other._rigName; } - protected VideoWriterOpenCv(VideoWriterOpenCv other) : - base(other) + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("message_type", Required=Newtonsoft.Json.Required.Always)] + public MessageType MessageType { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _fourCc = other._fourCc; + get + { + return _messageType; + } + set + { + _messageType = value; + } } - /// - /// Encoding frame rate - /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("protocol_version")] + public int ProtocolVersion { get { - return _frameRate; + return _protocolVersion; } set { - _frameRate = value; + _protocolVersion = value; } } /// - /// Container extension + /// The timestamp of the message /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("timestamp", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("The timestamp of the message")] + public System.DateTimeOffset? Timestamp { get { - return _containerExtension; + return _timestamp; } set { - _containerExtension = value; + _timestamp = value; } } /// - /// Four character code + /// The payload of the message /// - [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] - [System.ComponentModel.DescriptionAttribute("Four character code")] - public string FourCc + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("payload", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The payload of the message")] + public RegisteredPayload Payload { get { - return _fourCc; + return _payload; } set { - _fourCc = value; + _payload = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Process that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("process_id", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Process that created the message")] + public string ProcessId { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _processId; + } + set + { + _processId = value; } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("FourCc = " + _fourCc); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ZmqConnection - { - - private string _connectionString; - - private string _topic; - - public ZmqConnection() - { - _connectionString = "@tcp://localhost:5556"; - _topic = ""; - } - - protected ZmqConnection(ZmqConnection other) - { - _connectionString = other._connectionString; - _topic = other._topic; } /// - /// The connection string for the ZMQ socket. + /// Hostname that created the message /// - [Newtonsoft.Json.JsonPropertyAttribute("connection_string")] - [System.ComponentModel.DescriptionAttribute("The connection string for the ZMQ socket.")] - public string ConnectionString + [Newtonsoft.Json.JsonPropertyAttribute("hostname", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Hostname that created the message")] + public string Hostname { get { - return _connectionString; + return _hostname; } set { - _connectionString = value; + _hostname = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("topic")] - public string Topic + /// + /// Rig name that created the message + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Rig name that created the message")] + public string RigName { get { - return _topic; + return _rigName; } set { - _topic = value; + _rigName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqConnection(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RegisteredMessages(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ZmqConnection(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new RegisteredMessages(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("ConnectionString = " + _connectionString + ", "); - stringBuilder.Append("Topic = " + _topic); + stringBuilder.Append("MessageType = " + _messageType + ", "); + stringBuilder.Append("ProtocolVersion = " + _protocolVersion + ", "); + stringBuilder.Append("Timestamp = " + _timestamp + ", "); + stringBuilder.Append("Payload = " + _payload + ", "); + stringBuilder.Append("ProcessId = " + _processId + ", "); + stringBuilder.Append("Hostname = " + _hostname + ", "); + stringBuilder.Append("RigName = " + _rigName); return true; } @@ -3031,105 +773,103 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ZmqPubSub + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "payload_type")] + [JsonInheritanceAttribute("HeartbeatPayload", typeof(HeartbeatPayload))] + [JsonInheritanceAttribute("LogPayload", typeof(LogPayload))] + [JsonInheritanceAttribute("Start", typeof(StartPayload))] + [JsonInheritanceAttribute("Stop", typeof(StopPayload))] + public abstract partial class RegisteredPayload { - private ZmqConnection _pub; - - private ZmqConnection _sub; + protected RegisteredPayload() + { + } - public ZmqPubSub() + protected RegisteredPayload(RegisteredPayload other) { - _pub = new ZmqConnection(); - _sub = new ZmqConnection(); } - protected ZmqPubSub(ZmqPubSub other) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - _pub = other._pub; - _sub = other._sub; + return false; } - /// - /// ZMQ Publisher - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("pub", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("ZMQ Publisher")] - public ZmqConnection Pub + public override string ToString() { - get - { - return _pub; - } - set + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _pub = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class StartPayload : RegisteredPayload + { - /// - /// ZMQ Subscriber - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("sub", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("ZMQ Subscriber")] - public ZmqConnection Sub + public StartPayload() { - get - { - return _sub; - } - set - { - _sub = value; - } } - public System.IObservable Generate() + protected StartPayload(StartPayload other) : + base(other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqPubSub(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new ZmqPubSub(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StartPayload(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Pub = " + _pub + ", "); - stringBuilder.Append("Sub = " + _sub); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new StartPayload(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + return base.PrintMembers(stringBuilder); } } [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum SpinnakerCameraColorProcessing + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class StopPayload : RegisteredPayload { - [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] - Default = 0, + public StopPayload() + { + } + + protected StopPayload(StopPayload other) : + base(other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new StopPayload(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new StopPayload(this)); + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] - NoColorProcessing = 1, + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return base.PrintMembers(stringBuilder); + } } @@ -3277,8 +1017,6 @@ private string GetSubtypeDiscriminator(System.Type objectType) [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class MatchRegisteredPayload : Bonsai.Expressions.SingleArgumentExpressionBuilder { @@ -3315,47 +1053,6 @@ private static System.IObservable Process(System.IObservable))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); - return System.Linq.Expressions.Expression.Call( - typeof(MatchVideoWriter), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - - - private static System.IObservable Process(System.IObservable source) - where TResult : VideoWriter - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } - } - - /// /// Serializes a sequence of data model objects into JSON strings. /// @@ -3374,21 +1071,6 @@ private System.IObservable Process(System.IObservable source) return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -3404,11 +1086,6 @@ public System.IObservable Process(System.IObservable source) return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -3419,26 +1096,6 @@ public System.IObservable Process(System.IObservable return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -3448,31 +1105,6 @@ public System.IObservable Process(System.IObservable source { return Process(source); } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } } @@ -3483,32 +1115,19 @@ public System.IObservable Process(System.IObservable source) [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { public DeserializeFromJson() { - Type = new Bonsai.Expressions.TypeMapping(); + Type = new Bonsai.Expressions.TypeMapping(); } public Bonsai.Expressions.TypeMapping Type { get; set; } diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 4014e8d..30aa75e 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -44,7 +44,6 @@ class AindJustFramesRig(AindBehaviorRigModel): description="Camera controller to triggered cameras. Will use Camera1 register as a trigger.", ) harp_behavior: rig.harp.HarpBehavior = Field( - ..., description="Harp behavior board. Will be the source of triggers for the two camera controllers.", ) satellite_rigs: list[SatelliteRig] = Field( diff --git a/uv.lock b/uv.lock index daf53c9..57bce32 100644 --- a/uv.lock +++ b/uv.lock @@ -21,16 +21,16 @@ wheels = [ [[package]] name = "aind-behavior-curriculum" -version = "0.0.35" +version = "0.0.36" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/c7/bb935282362302860d3ae7bc6765be7fc3b2f74af0ca200ad8ed91f03dac/aind_behavior_curriculum-0.0.35.tar.gz", hash = "sha256:594b735a254f6ab9112504efd9eb78b5e2bbd5d93d2c88608889c8a38cfcd234", size = 122480, upload-time = "2025-10-02T23:41:57.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/e3/3d565a7d29c22734ebb5ccf785b994d0c32beb963e087a60afa3c93bf648/aind_behavior_curriculum-0.0.36.tar.gz", hash = "sha256:d996aa1bd82b83bb48e381ee02c590c2ba17f54f7d863cf337d6fa63840a82df", size = 122460, upload-time = "2025-10-24T17:43:34.681Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7d/d90a57207aebc7fa06c575d30248984821199450de78e932211da0becf76/aind_behavior_curriculum-0.0.35-py3-none-any.whl", hash = "sha256:bf4c64b61195fa15e73d381fe53aac438ede9ca09f8f57968220a48d335c0656", size = 47389, upload-time = "2025-10-02T23:41:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/18/a1/4f3116cf9539481f7c1dc62e86fc7bb0d7b3061a0c61cf17aae4f0b2f36c/aind_behavior_curriculum-0.0.36-py3-none-any.whl", hash = "sha256:11164ddf56d28b0a23330200582b20743d74bc2059ed07a4b3d2a660efc3c8d8", size = 47393, upload-time = "2025-10-24T17:43:33.3Z" }, ] [[package]] @@ -64,7 +64,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.12,<0.13" }, + { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.2,<0.9.0" }, { name = "pydantic-settings" }, ] @@ -87,8 +87,8 @@ docs = [ [[package]] name = "aind-behavior-services" -version = "0.12.3" -source = { registry = "https://pypi.org/simple" } +version = "0.13.0rc0" +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session#e874dab47d70af621ad4dd01ebc3d41010f1d3cd" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -96,14 +96,10 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/62/68a09654bf253bc1e653040c68d456ca928e385bbbb1bbf038da25134a84/aind_behavior_services-0.12.3.tar.gz", hash = "sha256:20bae171993017ebfd5d5ce09b610110947902b05c583f517c2efb732ab336f8", size = 27418, upload-time = "2025-10-15T22:16:00.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/c9/5b1b1da5a8dccabf4b6b9b42235eceaa4ee1f2c816a402e322f192f77a8a/aind_behavior_services-0.12.3-py3-none-any.whl", hash = "sha256:0a00588c1e29bac1295534e0c17169de862f914cd83b29248ff508fb782bdb3e", size = 38254, upload-time = "2025-10-15T22:15:59.672Z" }, -] [[package]] name = "aind-clabe" -version = "0.8.2" +version = "0.8.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, @@ -113,9 +109,9 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/37/dff7f633606ce87600a4114bd1dd506f2109d5d891f66030b5769426ac1c/aind_clabe-0.8.2.tar.gz", hash = "sha256:f384d51a541b900f5783a9523eba4f885cfa69850a2ac33881db07ca7a7f1d3a", size = 48635, upload-time = "2025-10-21T02:29:17.795Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/3a/7d03c8b72d22dabc876de4d0bd75a12711f5ea07369c93f561081ef2b710/aind_clabe-0.8.3.tar.gz", hash = "sha256:68cbea735a73e6cb592dbf490d7efe52573d6464bd236b3b777c29ac5fb1ea7e", size = 48656, upload-time = "2025-10-24T17:40:36.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/14/0ac35972d01f3a82bc1a720b42589929dd8beabc6066dc26ef16597e4e96/aind_clabe-0.8.2-py3-none-any.whl", hash = "sha256:d366a0495763d64d8bfb2fbc195951269b7e0fb3152bd967f944b48155384698", size = 66180, upload-time = "2025-10-21T02:29:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/50/58/6c4f436c2e0b97b6c0264c9fcd4e34412da972ef491c84499de079bc3fc1/aind_clabe-0.8.3-py3-none-any.whl", hash = "sha256:569b7e2bae8ae036d05e428772bbb13215e0892b7456cbf3ac1598d9ff0664c9", size = 66200, upload-time = "2025-10-24T17:40:35.575Z" }, ] [package.optional-dependencies] @@ -148,21 +144,21 @@ wheels = [ [[package]] name = "aind-data-schema-models" -version = "4.3.0" +version = "4.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/ea/a6b5bacf52de8e904ca9bb88dc1a5f8596dfa0b12fa5812e44041835d535/aind_data_schema_models-4.3.0.tar.gz", hash = "sha256:3608c89d91192d54dee40823e385e4f6dbdac658987af7fadefd68c02d3490fb", size = 324212, upload-time = "2025-09-22T21:54:25.374Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/1b/40bab07a353154c41bcdbea8875d61f307f2aee3a93b5b441fd4248cd5ff/aind_data_schema_models-4.6.0.tar.gz", hash = "sha256:9a060f90871c6ab61d2d4b6d4cf0ad86b1bf9715e4f3408697587c585d2ff543", size = 337971, upload-time = "2025-11-17T17:44:46.329Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/e6/136ff5288b154c022c4cb7a047faf946755aca597a75490767a479936921/aind_data_schema_models-4.3.0-py3-none-any.whl", hash = "sha256:62703b4425009c930511de366a85fb57e5dc52f7493fd0a49871a90429e5832f", size = 297854, upload-time = "2025-09-22T21:54:24.216Z" }, + { url = "https://files.pythonhosted.org/packages/1a/96/4fa5673f98975b9bf7bb61c3a8a2ff195cabddef9623b9d4d9c6cb8ce090/aind_data_schema_models-4.6.0-py3-none-any.whl", hash = "sha256:650c3791c59171aa95aba0930ac7448ea17d90c01603d832cb1a1d0fa3d028e7", size = 307102, upload-time = "2025-11-17T17:44:45.021Z" }, ] [[package]] name = "aind-data-transfer-service" -version = "1.19.1" +version = "1.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, @@ -170,9 +166,9 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/75/0cbf20d07d2e47c6d19f3f46bb1ebc5c884c9882b3f0934c8e20c830e058/aind_data_transfer_service-1.19.1.tar.gz", hash = "sha256:b4ac892453fb3a9de8981361fded4b18d608aa40d55874e0acc9a1c4de90f88a", size = 37441, upload-time = "2025-10-06T22:43:58.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/59/280af29afa129f6a58c43e9bb0f1dfc2654f24759b278940e0a5508b56af/aind_data_transfer_service-1.22.0.tar.gz", hash = "sha256:e7ec917fd3df1ee52979a4b78a74f24ae3fd3a5f4294dbf00c1d08a62bceab68", size = 38564, upload-time = "2025-11-24T23:39:06.299Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/62/594a4609d1ceda3b39147becc766dc52217d8f7c2b438d22cd6a8938f8f9/aind_data_transfer_service-1.19.1-py3-none-any.whl", hash = "sha256:c3fe2b1e51050db6492f35da70fde0755025d437e04e8d0b5b800db0e8abc4a5", size = 23370, upload-time = "2025-10-06T22:43:57.191Z" }, + { url = "https://files.pythonhosted.org/packages/43/f9/6256bb5b80bc7e51120a038a34a22b8368b6f76f0a340e55408d21c497fb/aind_data_transfer_service-1.22.0-py3-none-any.whl", hash = "sha256:436276434634aecbc4afa0fe25ba4b384151394824e57263d0b9f4f73f8d6a0b", size = 23972, upload-time = "2025-11-24T23:39:05.249Z" }, ] [[package]] @@ -278,11 +274,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.10.5" +version = "2025.11.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, + { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, ] [[package]] @@ -430,14 +426,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] @@ -947,83 +943,83 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" }, - { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" }, - { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" }, - { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" }, - { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" }, - { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" }, - { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" }, - { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, - { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, - { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, - { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, - { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, - { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, - { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, - { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, - { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, - { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, - { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, - { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, - { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, - { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, - { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, - { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, - { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, - { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, - { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, - { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, - { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, - { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, - { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, - { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, - { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, - { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, - { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, - { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, - { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, - { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, - { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, - { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, - { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, - { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, - { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, - { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, - { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, - { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, - { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, - { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, - { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, - { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, - { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, - { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, - { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, - { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" }, - { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" }, - { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" }, - { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" }, - { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" }, +version = "2.3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, + { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, + { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, + { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, + { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, + { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, + { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, + { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, + { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, + { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, + { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, + { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, + { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, + { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, + { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, + { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, + { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, + { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, + { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, + { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, + { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, + { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, + { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, + { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, + { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, + { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, + { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, + { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, + { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, + { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, + { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, + { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, + { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, + { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, + { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, + { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, + { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, + { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, + { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, ] [[package]] @@ -1169,7 +1165,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.3" +version = "2.12.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1177,116 +1173,120 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/1e/4f0a3233767010308f2fd6bd0814597e3f63f1dc98304a9112b8759df4ff/pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74", size = 819383, upload-time = "2025-10-17T15:04:21.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/ad/a17bc283d7d81837c061c49e3eaa27a45991759a1b7eae1031921c6bd924/pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac", size = 821038, upload-time = "2025-11-05T10:50:08.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/6b/83661fa77dcefa195ad5f8cd9af3d1a7450fd57cc883ad04d65446ac2029/pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf", size = 462431, upload-time = "2025-10-17T15:04:19.346Z" }, + { url = "https://files.pythonhosted.org/packages/82/2f/e68750da9b04856e2a7ec56fc6f034a5a79775e9b9a81882252789873798/pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e", size = 463400, upload-time = "2025-11-05T10:50:06.732Z" }, ] [[package]] name = "pydantic-core" -version = "2.41.4" +version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/4c/f6cbfa1e8efacd00b846764e8484fe173d25b8dab881e277a619177f3384/pydantic_core-2.41.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:28ff11666443a1a8cf2a044d6a545ebffa8382b5f7973f22c36109205e65dc80", size = 2109062, upload-time = "2025-10-14T10:20:04.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/f8/40b72d3868896bfcd410e1bd7e516e762d326201c48e5b4a06446f6cf9e8/pydantic_core-2.41.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61760c3925d4633290292bad462e0f737b840508b4f722247d8729684f6539ae", size = 1916301, upload-time = "2025-10-14T10:20:06.857Z" }, - { url = "https://files.pythonhosted.org/packages/94/4d/d203dce8bee7faeca791671c88519969d98d3b4e8f225da5b96dad226fc8/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae547b7315d055b0de2ec3965643b0ab82ad0106a7ffd29615ee9f266a02827", size = 1968728, upload-time = "2025-10-14T10:20:08.353Z" }, - { url = "https://files.pythonhosted.org/packages/65/f5/6a66187775df87c24d526985b3a5d78d861580ca466fbd9d4d0e792fcf6c/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef9ee5471edd58d1fcce1c80ffc8783a650e3e3a193fe90d52e43bb4d87bff1f", size = 2050238, upload-time = "2025-10-14T10:20:09.766Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b9/78336345de97298cf53236b2f271912ce11f32c1e59de25a374ce12f9cce/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15dd504af121caaf2c95cb90c0ebf71603c53de98305621b94da0f967e572def", size = 2249424, upload-time = "2025-10-14T10:20:11.732Z" }, - { url = "https://files.pythonhosted.org/packages/99/bb/a4584888b70ee594c3d374a71af5075a68654d6c780369df269118af7402/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a926768ea49a8af4d36abd6a8968b8790f7f76dd7cbd5a4c180db2b4ac9a3a2", size = 2366047, upload-time = "2025-10-14T10:20:13.647Z" }, - { url = "https://files.pythonhosted.org/packages/5f/8d/17fc5de9d6418e4d2ae8c675f905cdafdc59d3bf3bf9c946b7ab796a992a/pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916b9b7d134bff5440098a4deb80e4cb623e68974a87883299de9124126c2a8", size = 2071163, upload-time = "2025-10-14T10:20:15.307Z" }, - { url = "https://files.pythonhosted.org/packages/54/e7/03d2c5c0b8ed37a4617430db68ec5e7dbba66358b629cd69e11b4d564367/pydantic_core-2.41.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cf90535979089df02e6f17ffd076f07237efa55b7343d98760bde8743c4b265", size = 2190585, upload-time = "2025-10-14T10:20:17.3Z" }, - { url = "https://files.pythonhosted.org/packages/be/fc/15d1c9fe5ad9266a5897d9b932b7f53d7e5cfc800573917a2c5d6eea56ec/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7533c76fa647fade2d7ec75ac5cc079ab3f34879626dae5689b27790a6cf5a5c", size = 2150109, upload-time = "2025-10-14T10:20:19.143Z" }, - { url = "https://files.pythonhosted.org/packages/26/ef/e735dd008808226c83ba56972566138665b71477ad580fa5a21f0851df48/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:37e516bca9264cbf29612539801ca3cd5d1be465f940417b002905e6ed79d38a", size = 2315078, upload-time = "2025-10-14T10:20:20.742Z" }, - { url = "https://files.pythonhosted.org/packages/90/00/806efdcf35ff2ac0f938362350cd9827b8afb116cc814b6b75cf23738c7c/pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c19cb355224037c83642429b8ce261ae108e1c5fbf5c028bac63c77b0f8646e", size = 2318737, upload-time = "2025-10-14T10:20:22.306Z" }, - { url = "https://files.pythonhosted.org/packages/41/7e/6ac90673fe6cb36621a2283552897838c020db343fa86e513d3f563b196f/pydantic_core-2.41.4-cp311-cp311-win32.whl", hash = "sha256:09c2a60e55b357284b5f31f5ab275ba9f7f70b7525e18a132ec1f9160b4f1f03", size = 1974160, upload-time = "2025-10-14T10:20:23.817Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9d/7c5e24ee585c1f8b6356e1d11d40ab807ffde44d2db3b7dfd6d20b09720e/pydantic_core-2.41.4-cp311-cp311-win_amd64.whl", hash = "sha256:711156b6afb5cb1cb7c14a2cc2c4a8b4c717b69046f13c6b332d8a0a8f41ca3e", size = 2021883, upload-time = "2025-10-14T10:20:25.48Z" }, - { url = "https://files.pythonhosted.org/packages/33/90/5c172357460fc28b2871eb4a0fb3843b136b429c6fa827e4b588877bf115/pydantic_core-2.41.4-cp311-cp311-win_arm64.whl", hash = "sha256:6cb9cf7e761f4f8a8589a45e49ed3c0d92d1d696a45a6feaee8c904b26efc2db", size = 1968026, upload-time = "2025-10-14T10:20:27.039Z" }, - { url = "https://files.pythonhosted.org/packages/e9/81/d3b3e95929c4369d30b2a66a91db63c8ed0a98381ae55a45da2cd1cc1288/pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887", size = 2099043, upload-time = "2025-10-14T10:20:28.561Z" }, - { url = "https://files.pythonhosted.org/packages/58/da/46fdac49e6717e3a94fc9201403e08d9d61aa7a770fab6190b8740749047/pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2", size = 1910699, upload-time = "2025-10-14T10:20:30.217Z" }, - { url = "https://files.pythonhosted.org/packages/1e/63/4d948f1b9dd8e991a5a98b77dd66c74641f5f2e5225fee37994b2e07d391/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999", size = 1952121, upload-time = "2025-10-14T10:20:32.246Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a7/e5fc60a6f781fc634ecaa9ecc3c20171d238794cef69ae0af79ac11b89d7/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4", size = 2041590, upload-time = "2025-10-14T10:20:34.332Z" }, - { url = "https://files.pythonhosted.org/packages/70/69/dce747b1d21d59e85af433428978a1893c6f8a7068fa2bb4a927fba7a5ff/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f", size = 2219869, upload-time = "2025-10-14T10:20:35.965Z" }, - { url = "https://files.pythonhosted.org/packages/83/6a/c070e30e295403bf29c4df1cb781317b6a9bac7cd07b8d3acc94d501a63c/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b", size = 2345169, upload-time = "2025-10-14T10:20:37.627Z" }, - { url = "https://files.pythonhosted.org/packages/f0/83/06d001f8043c336baea7fd202a9ac7ad71f87e1c55d8112c50b745c40324/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47", size = 2070165, upload-time = "2025-10-14T10:20:39.246Z" }, - { url = "https://files.pythonhosted.org/packages/14/0a/e567c2883588dd12bcbc110232d892cf385356f7c8a9910311ac997ab715/pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970", size = 2189067, upload-time = "2025-10-14T10:20:41.015Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1d/3d9fca34273ba03c9b1c5289f7618bc4bd09c3ad2289b5420481aa051a99/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed", size = 2132997, upload-time = "2025-10-14T10:20:43.106Z" }, - { url = "https://files.pythonhosted.org/packages/52/70/d702ef7a6cd41a8afc61f3554922b3ed8d19dd54c3bd4bdbfe332e610827/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8", size = 2307187, upload-time = "2025-10-14T10:20:44.849Z" }, - { url = "https://files.pythonhosted.org/packages/68/4c/c06be6e27545d08b802127914156f38d10ca287a9e8489342793de8aae3c/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431", size = 2305204, upload-time = "2025-10-14T10:20:46.781Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e5/35ae4919bcd9f18603419e23c5eaf32750224a89d41a8df1a3704b69f77e/pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd", size = 1972536, upload-time = "2025-10-14T10:20:48.39Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c2/49c5bb6d2a49eb2ee3647a93e3dae7080c6409a8a7558b075027644e879c/pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff", size = 2031132, upload-time = "2025-10-14T10:20:50.421Z" }, - { url = "https://files.pythonhosted.org/packages/06/23/936343dbcba6eec93f73e95eb346810fc732f71ba27967b287b66f7b7097/pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8", size = 1969483, upload-time = "2025-10-14T10:20:52.35Z" }, - { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" }, - { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" }, - { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" }, - { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" }, - { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" }, - { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" }, - { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" }, - { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" }, - { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" }, - { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" }, - { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" }, - { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" }, - { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" }, - { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" }, - { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" }, - { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" }, - { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" }, - { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" }, - { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" }, - { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" }, - { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" }, - { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" }, - { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" }, - { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" }, - { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" }, - { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" }, - { url = "https://files.pythonhosted.org/packages/b0/12/5ba58daa7f453454464f92b3ca7b9d7c657d8641c48e370c3ebc9a82dd78/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a1b2cfec3879afb742a7b0bcfa53e4f22ba96571c9e54d6a3afe1052d17d843b", size = 2122139, upload-time = "2025-10-14T10:22:47.288Z" }, - { url = "https://files.pythonhosted.org/packages/21/fb/6860126a77725c3108baecd10fd3d75fec25191d6381b6eb2ac660228eac/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:d175600d975b7c244af6eb9c9041f10059f20b8bbffec9e33fdd5ee3f67cdc42", size = 1936674, upload-time = "2025-10-14T10:22:49.555Z" }, - { url = "https://files.pythonhosted.org/packages/de/be/57dcaa3ed595d81f8757e2b44a38240ac5d37628bce25fb20d02c7018776/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f184d657fa4947ae5ec9c47bd7e917730fa1cbb78195037e32dcbab50aca5ee", size = 1956398, upload-time = "2025-10-14T10:22:52.19Z" }, - { url = "https://files.pythonhosted.org/packages/2f/1d/679a344fadb9695f1a6a294d739fbd21d71fa023286daeea8c0ed49e7c2b/pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed810568aeffed3edc78910af32af911c835cc39ebbfacd1f0ab5dd53028e5c", size = 2138674, upload-time = "2025-10-14T10:22:54.499Z" }, - { url = "https://files.pythonhosted.org/packages/c4/48/ae937e5a831b7c0dc646b2ef788c27cd003894882415300ed21927c21efa/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537", size = 2112087, upload-time = "2025-10-14T10:22:56.818Z" }, - { url = "https://files.pythonhosted.org/packages/5e/db/6db8073e3d32dae017da7e0d16a9ecb897d0a4d92e00634916e486097961/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94", size = 1920387, upload-time = "2025-10-14T10:22:59.342Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c1/dd3542d072fcc336030d66834872f0328727e3b8de289c662faa04aa270e/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c", size = 1951495, upload-time = "2025-10-14T10:23:02.089Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c6/db8d13a1f8ab3f1eb08c88bd00fd62d44311e3456d1e85c0e59e0a0376e7/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335", size = 2139008, upload-time = "2025-10-14T10:23:04.539Z" }, - { url = "https://files.pythonhosted.org/packages/7e/7d/138e902ed6399b866f7cfe4435d22445e16fff888a1c00560d9dc79a780f/pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:491535d45cd7ad7e4a2af4a5169b0d07bebf1adfd164b0368da8aa41e19907a5", size = 2104721, upload-time = "2025-10-14T10:23:26.906Z" }, - { url = "https://files.pythonhosted.org/packages/47/13/0525623cf94627f7b53b4c2034c81edc8491cbfc7c28d5447fa318791479/pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:54d86c0cada6aba4ec4c047d0e348cbad7063b87ae0f005d9f8c9ad04d4a92a2", size = 1931608, upload-time = "2025-10-14T10:23:29.306Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f9/744bc98137d6ef0a233f808bfc9b18cf94624bf30836a18d3b05d08bf418/pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca1124aced216b2500dc2609eade086d718e8249cb9696660ab447d50a758bd", size = 2132986, upload-time = "2025-10-14T10:23:32.057Z" }, - { url = "https://files.pythonhosted.org/packages/17/c8/629e88920171173f6049386cc71f893dff03209a9ef32b4d2f7e7c264bcf/pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c9024169becccf0cb470ada03ee578d7348c119a0d42af3dcf9eda96e3a247c", size = 2187516, upload-time = "2025-10-14T10:23:34.871Z" }, - { url = "https://files.pythonhosted.org/packages/2e/0f/4f2734688d98488782218ca61bcc118329bf5de05bb7fe3adc7dd79b0b86/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:26895a4268ae5a2849269f4991cdc97236e4b9c010e51137becf25182daac405", size = 2146146, upload-time = "2025-10-14T10:23:37.342Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f2/ab385dbd94a052c62224b99cf99002eee99dbec40e10006c78575aead256/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:ca4df25762cf71308c446e33c9b1fdca2923a3f13de616e2a949f38bf21ff5a8", size = 2311296, upload-time = "2025-10-14T10:23:40.145Z" }, - { url = "https://files.pythonhosted.org/packages/fc/8e/e4f12afe1beeb9823bba5375f8f258df0cc61b056b0195fb1cf9f62a1a58/pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5a28fcedd762349519276c36634e71853b4541079cab4acaaac60c4421827308", size = 2315386, upload-time = "2025-10-14T10:23:42.624Z" }, - { url = "https://files.pythonhosted.org/packages/48/f7/925f65d930802e3ea2eb4d5afa4cb8730c8dc0d2cb89a59dc4ed2fcb2d74/pydantic_core-2.41.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c173ddcd86afd2535e2b695217e82191580663a1d1928239f877f5a1649ef39f", size = 2147775, upload-time = "2025-10-14T10:23:45.406Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] name = "pydantic-settings" -version = "2.11.0" +version = "2.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, + { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, ] [[package]] @@ -1371,11 +1371,11 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.1.1" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, ] [[package]] @@ -1493,70 +1493,76 @@ wheels = [ [[package]] name = "ruamel-yaml-clib" -version = "0.2.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/e9/39ec4d4b3f91188fad1842748f67d4e749c77c37e353c4e545052ee8e893/ruamel.yaml.clib-0.2.14.tar.gz", hash = "sha256:803f5044b13602d58ea378576dd75aa759f52116a0232608e8fdada4da33752e", size = 225394, upload-time = "2025-09-22T19:51:23.753Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/9f/3c51e9578b8c36fcc4bdd271a1a5bb65963a74a4b6ad1a989768a22f6c2a/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bae1a073ca4244620425cd3d3aa9746bde590992b98ee8c7c8be8c597ca0d4e", size = 270207, upload-time = "2025-09-23T14:24:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/4a/16/cb02815bc2ae9c66760c0c061d23c7358f9ba51dae95ac85247662b7fbe2/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0a54e5e40a7a691a426c2703b09b0d61a14294d25cfacc00631aa6f9c964df0d", size = 137780, upload-time = "2025-09-22T19:50:37.734Z" }, - { url = "https://files.pythonhosted.org/packages/31/c6/fc687cd1b93bff8e40861eea46d6dc1a6a778d9a085684e4045ff26a8e40/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10d9595b6a19778f3269399eff6bab642608e5966183abc2adbe558a42d4efc9", size = 641590, upload-time = "2025-09-22T19:50:41.978Z" }, - { url = "https://files.pythonhosted.org/packages/45/5d/65a2bc08b709b08576b3f307bf63951ee68a8e047cbbda6f1c9864ecf9a7/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba72975485f2b87b786075e18a6e5d07dc2b4d8973beb2732b9b2816f1bad70", size = 738090, upload-time = "2025-09-22T19:50:39.152Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d0/a70a03614d9a6788a3661ab1538879ed2aae4e84d861f101243116308a37/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29757bdb7c142f9595cc1b62ec49a3d1c83fab9cef92db52b0ccebaad4eafb98", size = 700744, upload-time = "2025-09-22T19:50:40.811Z" }, - { url = "https://files.pythonhosted.org/packages/77/30/c93fa457611f79946d5cb6cc97493ca5425f3f21891d7b1f9b44eaa1b38e/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:557df28dbccf79b152fe2d1b935f6063d9cc431199ea2b0e84892f35c03bb0ee", size = 742321, upload-time = "2025-09-23T18:42:48.916Z" }, - { url = "https://files.pythonhosted.org/packages/40/85/e2c54ad637117cd13244a4649946eaa00f32edcb882d1f92df90e079ab00/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:26a8de280ab0d22b6e3ec745b4a5a07151a0f74aad92dd76ab9c8d8d7087720d", size = 743805, upload-time = "2025-09-22T19:50:43.58Z" }, - { url = "https://files.pythonhosted.org/packages/81/50/f899072c38877d8ef5382e0b3d47f8c4346226c1f52d6945d6f64fec6a2f/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e501c096aa3889133d674605ebd018471bc404a59cbc17da3c5924421c54d97c", size = 769529, upload-time = "2025-09-22T19:50:45.707Z" }, - { url = "https://files.pythonhosted.org/packages/99/7c/96d4b5075e30c65ea2064e40c2d657c7c235d7b6ef18751cf89a935b9041/ruamel.yaml.clib-0.2.14-cp311-cp311-win32.whl", hash = "sha256:915748cfc25b8cfd81b14d00f4bfdb2ab227a30d6d43459034533f4d1c207a2a", size = 100256, upload-time = "2025-09-22T19:50:48.26Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8c/73ee2babd04e8bfcf1fd5c20aa553d18bf0ebc24b592b4f831d12ae46cc0/ruamel.yaml.clib-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:4ccba93c1e5a40af45b2f08e4591969fa4697eae951c708f3f83dcbf9f6c6bb1", size = 118234, upload-time = "2025-09-22T19:50:47.019Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/ccfb34a25289afbbc42017e4d3d4288e61d35b2e00cfc6b92974a6a1f94b/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6aeadc170090ff1889f0d2c3057557f9cd71f975f17535c26a5d37af98f19c27", size = 271775, upload-time = "2025-09-23T14:24:12.771Z" }, - { url = "https://files.pythonhosted.org/packages/82/73/e628a92e80197ff6a79ab81ec3fa00d4cc082d58ab78d3337b7ba7043301/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5e56ac47260c0eed992789fa0b8efe43404a9adb608608631a948cee4fc2b052", size = 138842, upload-time = "2025-09-22T19:50:49.156Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c5/346c7094344a60419764b4b1334d9e0285031c961176ff88ffb652405b0c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a911aa73588d9a8b08d662b9484bc0567949529824a55d3885b77e8dd62a127a", size = 647404, upload-time = "2025-09-22T19:50:52.921Z" }, - { url = "https://files.pythonhosted.org/packages/df/99/65080c863eb06d4498de3d6c86f3e90595e02e159fd8529f1565f56cfe2c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05ba88adf3d7189a974b2de7a9d56731548d35dc0a822ec3dc669caa7019b29", size = 753141, upload-time = "2025-09-22T19:50:50.294Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e3/0de85f3e3333f8e29e4b10244374a202a87665d1131798946ee22cf05c7c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb04c5650de6668b853623eceadcdb1a9f2fee381f5d7b6bc842ee7c239eeec4", size = 703477, upload-time = "2025-09-22T19:50:51.508Z" }, - { url = "https://files.pythonhosted.org/packages/d9/25/0d2f09d8833c7fd77ab8efeff213093c16856479a9d293180a0d89f6bed9/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df3ec9959241d07bc261f4983d25a1205ff37703faf42b474f15d54d88b4f8c9", size = 741157, upload-time = "2025-09-23T18:42:50.408Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8c/959f10c2e2153cbdab834c46e6954b6dd9e3b109c8f8c0a3cf1618310985/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbc08c02e9b147a11dfcaa1ac8a83168b699863493e183f7c0c8b12850b7d259", size = 745859, upload-time = "2025-09-22T19:50:54.497Z" }, - { url = "https://files.pythonhosted.org/packages/ed/6b/e580a7c18b485e1a5f30a32cda96b20364b0ba649d9d2baaf72f8bd21f83/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c099cafc1834d3c5dac305865d04235f7c21c167c8dd31ebc3d6bbc357e2f023", size = 770200, upload-time = "2025-09-22T19:50:55.718Z" }, - { url = "https://files.pythonhosted.org/packages/ef/44/3455eebc761dc8e8fdced90f2b0a3fa61e32ba38b50de4130e2d57db0f21/ruamel.yaml.clib-0.2.14-cp312-cp312-win32.whl", hash = "sha256:b5b0f7e294700b615a3bcf6d28b26e6da94e8eba63b079f4ec92e9ba6c0d6b54", size = 98829, upload-time = "2025-09-22T19:50:58.895Z" }, - { url = "https://files.pythonhosted.org/packages/76/ab/5121f7f3b651db93de546f8c982c241397aad0a4765d793aca1dac5eadee/ruamel.yaml.clib-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:a37f40a859b503304dd740686359fcf541d6fb3ff7fc10f539af7f7150917c68", size = 115570, upload-time = "2025-09-22T19:50:57.981Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ae/e3811f05415594025e96000349d3400978adaed88d8f98d494352d9761ee/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7e4f9da7e7549946e02a6122dcad00b7c1168513acb1f8a726b1aaf504a99d32", size = 269205, upload-time = "2025-09-23T14:24:15.06Z" }, - { url = "https://files.pythonhosted.org/packages/72/06/7d51f4688d6d72bb72fa74254e1593c4f5ebd0036be5b41fe39315b275e9/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:dd7546c851e59c06197a7c651335755e74aa383a835878ca86d2c650c07a2f85", size = 137417, upload-time = "2025-09-22T19:50:59.82Z" }, - { url = "https://files.pythonhosted.org/packages/5a/08/b4499234a420ef42960eeb05585df5cc7eb25ccb8c980490b079e6367050/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1c1acc3a0209ea9042cc3cfc0790edd2eddd431a2ec3f8283d081e4d5018571e", size = 642558, upload-time = "2025-09-22T19:51:03.388Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ba/1975a27dedf1c4c33306ee67c948121be8710b19387aada29e2f139c43ee/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2070bf0ad1540d5c77a664de07ebcc45eebd1ddcab71a7a06f26936920692beb", size = 744087, upload-time = "2025-09-22T19:51:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/20/15/8a19a13d27f3bd09fa18813add8380a29115a47b553845f08802959acbce/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd8fe07f49c170e09d76773fb86ad9135e0beee44f36e1576a201b0676d3d1d", size = 699709, upload-time = "2025-09-22T19:51:02.075Z" }, - { url = "https://files.pythonhosted.org/packages/19/ee/8d6146a079ad21e534b5083c9ee4a4c8bec42f79cf87594b60978286b39a/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff86876889ea478b1381089e55cf9e345707b312beda4986f823e1d95e8c0f59", size = 708926, upload-time = "2025-09-23T18:42:51.707Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/426b714abdc222392e68f3b8ad323930d05a214a27c7e7a0f06c69126401/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1f118b707eece8cf84ecbc3e3ec94d9db879d85ed608f95870d39b2d2efa5dca", size = 740202, upload-time = "2025-09-22T19:51:04.673Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ac/3c5c2b27a183f4fda8a57c82211721c016bcb689a4a175865f7646db9f94/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b30110b29484adc597df6bd92a37b90e63a8c152ca8136aad100a02f8ba6d1b6", size = 765196, upload-time = "2025-09-22T19:51:05.916Z" }, - { url = "https://files.pythonhosted.org/packages/92/2e/06f56a71fd55021c993ed6e848c9b2e5e9cfce180a42179f0ddd28253f7c/ruamel.yaml.clib-0.2.14-cp313-cp313-win32.whl", hash = "sha256:f4e97a1cf0b7a30af9e1d9dad10a5671157b9acee790d9e26996391f49b965a2", size = 98635, upload-time = "2025-09-22T19:51:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/76aba16a1689b50528224b182f71097ece338e7a4ab55e84c2e73443b78a/ruamel.yaml.clib-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:090782b5fb9d98df96509eecdbcaffd037d47389a89492320280d52f91330d78", size = 115238, upload-time = "2025-09-22T19:51:07.081Z" }, - { url = "https://files.pythonhosted.org/packages/21/e2/a59ff65c26aaf21a24eb38df777cb9af5d87ba8fc8107c163c2da9d1e85e/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7df6f6e9d0e33c7b1d435defb185095386c469109de723d514142632a7b9d07f", size = 271441, upload-time = "2025-09-23T14:24:16.498Z" }, - { url = "https://files.pythonhosted.org/packages/6b/fa/3234f913fe9a6525a7b97c6dad1f51e72b917e6872e051a5e2ffd8b16fbb/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83", size = 137970, upload-time = "2025-09-22T19:51:09.472Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ec/4edbf17ac2c87fa0845dd366ef8d5852b96eb58fcd65fc1ecf5fe27b4641/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27", size = 739639, upload-time = "2025-09-22T19:51:10.566Z" }, - { url = "https://files.pythonhosted.org/packages/15/18/b0e1fafe59051de9e79cdd431863b03593ecfa8341c110affad7c8121efc/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640", size = 764456, upload-time = "2025-09-22T19:51:11.736Z" }, +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, ] [[package]] name = "ruff" -version = "0.14.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/58/6ca66896635352812de66f71cdf9ff86b3a4f79071ca5730088c0cd0fc8d/ruff-0.14.1.tar.gz", hash = "sha256:1dd86253060c4772867c61791588627320abcb6ed1577a90ef432ee319729b69", size = 5513429, upload-time = "2025-10-16T18:05:41.766Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/39/9cc5ab181478d7a18adc1c1e051a84ee02bec94eb9bdfd35643d7c74ca31/ruff-0.14.1-py3-none-linux_armv6l.whl", hash = "sha256:083bfc1f30f4a391ae09c6f4f99d83074416b471775b59288956f5bc18e82f8b", size = 12445415, upload-time = "2025-10-16T18:04:48.227Z" }, - { url = "https://files.pythonhosted.org/packages/ef/2e/1226961855ccd697255988f5a2474890ac7c5863b080b15bd038df820818/ruff-0.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f6fa757cd717f791009f7669fefb09121cc5f7d9bd0ef211371fad68c2b8b224", size = 12784267, upload-time = "2025-10-16T18:04:52.515Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ea/fd9e95863124ed159cd0667ec98449ae461de94acda7101f1acb6066da00/ruff-0.14.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6191903d39ac156921398e9c86b7354d15e3c93772e7dbf26c9fcae59ceccd5", size = 11781872, upload-time = "2025-10-16T18:04:55.396Z" }, - { url = "https://files.pythonhosted.org/packages/1e/5a/e890f7338ff537dba4589a5e02c51baa63020acfb7c8cbbaea4831562c96/ruff-0.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed04f0e04f7a4587244e5c9d7df50e6b5bf2705d75059f409a6421c593a35896", size = 12226558, upload-time = "2025-10-16T18:04:58.166Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7a/8ab5c3377f5bf31e167b73651841217542bcc7aa1c19e83030835cc25204/ruff-0.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9e6cf6cd4acae0febbce29497accd3632fe2025c0c583c8b87e8dbdeae5f61", size = 12187898, upload-time = "2025-10-16T18:05:01.455Z" }, - { url = "https://files.pythonhosted.org/packages/48/8d/ba7c33aa55406955fc124e62c8259791c3d42e3075a71710fdff9375134f/ruff-0.14.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fa2458527794ecdfbe45f654e42c61f2503a230545a91af839653a0a93dbc6", size = 12939168, upload-time = "2025-10-16T18:05:04.397Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c2/70783f612b50f66d083380e68cbd1696739d88e9b4f6164230375532c637/ruff-0.14.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:39f1c392244e338b21d42ab29b8a6392a722c5090032eb49bb4d6defcdb34345", size = 14386942, upload-time = "2025-10-16T18:05:07.102Z" }, - { url = "https://files.pythonhosted.org/packages/48/44/cd7abb9c776b66d332119d67f96acf15830d120f5b884598a36d9d3f4d83/ruff-0.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7382fa12a26cce1f95070ce450946bec357727aaa428983036362579eadcc5cf", size = 13990622, upload-time = "2025-10-16T18:05:09.882Z" }, - { url = "https://files.pythonhosted.org/packages/eb/56/4259b696db12ac152fe472764b4f78bbdd9b477afd9bc3a6d53c01300b37/ruff-0.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0bf2be3ae8521e1093a487c4aa3b455882f139787770698530d28ed3fbb37c", size = 13431143, upload-time = "2025-10-16T18:05:13.46Z" }, - { url = "https://files.pythonhosted.org/packages/e0/35/266a80d0eb97bd224b3265b9437bd89dde0dcf4faf299db1212e81824e7e/ruff-0.14.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabcaa9ccf8089fb4fdb78d17cc0e28241520f50f4c2e88cb6261ed083d85151", size = 13132844, upload-time = "2025-10-16T18:05:16.1Z" }, - { url = "https://files.pythonhosted.org/packages/65/6e/d31ce218acc11a8d91ef208e002a31acf315061a85132f94f3df7a252b18/ruff-0.14.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:747d583400f6125ec11a4c14d1c8474bf75d8b419ad22a111a537ec1a952d192", size = 13401241, upload-time = "2025-10-16T18:05:19.395Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b5/dbc4221bf0b03774b3b2f0d47f39e848d30664157c15b965a14d890637d2/ruff-0.14.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5a6e74c0efd78515a1d13acbfe6c90f0f5bd822aa56b4a6d43a9ffb2ae6e56cd", size = 12132476, upload-time = "2025-10-16T18:05:22.163Z" }, - { url = "https://files.pythonhosted.org/packages/98/4b/ac99194e790ccd092d6a8b5f341f34b6e597d698e3077c032c502d75ea84/ruff-0.14.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0ea6a864d2fb41a4b6d5b456ed164302a0d96f4daac630aeba829abfb059d020", size = 12139749, upload-time = "2025-10-16T18:05:25.162Z" }, - { url = "https://files.pythonhosted.org/packages/47/26/7df917462c3bb5004e6fdfcc505a49e90bcd8a34c54a051953118c00b53a/ruff-0.14.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0826b8764f94229604fa255918d1cc45e583e38c21c203248b0bfc9a0e930be5", size = 12544758, upload-time = "2025-10-16T18:05:28.018Z" }, - { url = "https://files.pythonhosted.org/packages/64/d0/81e7f0648e9764ad9b51dd4be5e5dac3fcfff9602428ccbae288a39c2c22/ruff-0.14.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cbc52160465913a1a3f424c81c62ac8096b6a491468e7d872cb9444a860bc33d", size = 13221811, upload-time = "2025-10-16T18:05:30.707Z" }, - { url = "https://files.pythonhosted.org/packages/c3/07/3c45562c67933cc35f6d5df4ca77dabbcd88fddaca0d6b8371693d29fd56/ruff-0.14.1-py3-none-win32.whl", hash = "sha256:e037ea374aaaff4103240ae79168c0945ae3d5ae8db190603de3b4012bd1def6", size = 12319467, upload-time = "2025-10-16T18:05:33.261Z" }, - { url = "https://files.pythonhosted.org/packages/02/88/0ee4ca507d4aa05f67e292d2e5eb0b3e358fbcfe527554a2eda9ac422d6b/ruff-0.14.1-py3-none-win_amd64.whl", hash = "sha256:59d599cdff9c7f925a017f6f2c256c908b094e55967f93f2821b1439928746a1", size = 13401123, upload-time = "2025-10-16T18:05:35.984Z" }, - { url = "https://files.pythonhosted.org/packages/b8/81/4b6387be7014858d924b843530e1b2a8e531846807516e9bea2ee0936bf7/ruff-0.14.1-py3-none-win_arm64.whl", hash = "sha256:e3b443c4c9f16ae850906b8d0a707b2a4c16f8d2f0a7fe65c475c5886665ce44", size = 12436636, upload-time = "2025-10-16T18:05:38.995Z" }, +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/f0/62b5a1a723fe183650109407fa56abb433b00aa1c0b9ba555f9c4efec2c6/ruff-0.14.6.tar.gz", hash = "sha256:6f0c742ca6a7783a736b867a263b9a7a80a45ce9bee391eeda296895f1b4e1cc", size = 5669501, upload-time = "2025-11-21T14:26:17.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/d2/7dd544116d107fffb24a0064d41a5d2ed1c9d6372d142f9ba108c8e39207/ruff-0.14.6-py3-none-linux_armv6l.whl", hash = "sha256:d724ac2f1c240dbd01a2ae98db5d1d9a5e1d9e96eba999d1c48e30062df578a3", size = 13326119, upload-time = "2025-11-21T14:25:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9f7539ea257aa4d07b7ce87aed580e485c40143f2473ff2f2b75aee003186004", size = 13526007, upload-time = "2025-11-21T14:25:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7f6007e55b90a2a7e93083ba48a9f23c3158c433591c33ee2e99a49b889c6332", size = 12676572, upload-time = "2025-11-21T14:25:29.826Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/f319e87759949062cfee1b26245048e92e2acce900ad3a909285f9db1859/ruff-0.14.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8e7b9d73d8728b68f632aa8e824ef041d068d231d8dbc7808532d3629a6bef", size = 13140745, upload-time = "2025-11-21T14:25:32.788Z" }, + { url = "https://files.pythonhosted.org/packages/95/d3/248c1efc71a0a8ed4e8e10b4b2266845d7dfc7a0ab64354afe049eaa1310/ruff-0.14.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d50d45d4553a3ebcbd33e7c5e0fe6ca4aafd9a9122492de357205c2c48f00775", size = 13076486, upload-time = "2025-11-21T14:25:35.601Z" }, + { url = "https://files.pythonhosted.org/packages/a5/19/b68d4563fe50eba4b8c92aa842149bb56dd24d198389c0ed12e7faff4f7d/ruff-0.14.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:118548dd121f8a21bfa8ab2c5b80e5b4aed67ead4b7567790962554f38e598ce", size = 13727563, upload-time = "2025-11-21T14:25:38.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/943169436832d4b0e867235abbdb57ce3a82367b47e0280fa7b4eabb7593/ruff-0.14.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:57256efafbfefcb8748df9d1d766062f62b20150691021f8ab79e2d919f7c11f", size = 15199755, upload-time = "2025-11-21T14:25:41.516Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b9/288bb2399860a36d4bb0541cb66cce3c0f4156aaff009dc8499be0c24bf2/ruff-0.14.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff18134841e5c68f8e5df1999a64429a02d5549036b394fafbe410f886e1989d", size = 14850608, upload-time = "2025-11-21T14:25:44.428Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b1/a0d549dd4364e240f37e7d2907e97ee80587480d98c7799d2d8dc7a2f605/ruff-0.14.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c4b7ec1e66a105d5c27bd57fa93203637d66a26d10ca9809dc7fc18ec58440", size = 14118754, upload-time = "2025-11-21T14:25:47.214Z" }, + { url = "https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167843a6f78680746d7e226f255d920aeed5e4ad9c03258094a2d49d3028b105", size = 13949214, upload-time = "2025-11-21T14:25:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/12/27/4dad6c6a77fede9560b7df6802b1b697e97e49ceabe1f12baf3ea20862e9/ruff-0.14.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:16a33af621c9c523b1ae006b1b99b159bf5ac7e4b1f20b85b2572455018e0821", size = 14106112, upload-time = "2025-11-21T14:25:52.841Z" }, + { url = "https://files.pythonhosted.org/packages/6a/db/23e322d7177873eaedea59a7932ca5084ec5b7e20cb30f341ab594130a71/ruff-0.14.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1432ab6e1ae2dc565a7eea707d3b03a0c234ef401482a6f1621bc1f427c2ff55", size = 13035010, upload-time = "2025-11-21T14:25:55.536Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9c/20e21d4d69dbb35e6a1df7691e02f363423658a20a2afacf2a2c011800dc/ruff-0.14.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c55cfbbe7abb61eb914bfd20683d14cdfb38a6d56c6c66efa55ec6570ee4e71", size = 13054082, upload-time = "2025-11-21T14:25:58.625Z" }, + { url = "https://files.pythonhosted.org/packages/66/25/906ee6a0464c3125c8d673c589771a974965c2be1a1e28b5c3b96cb6ef88/ruff-0.14.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:efea3c0f21901a685fff4befda6d61a1bf4cb43de16da87e8226a281d614350b", size = 13303354, upload-time = "2025-11-21T14:26:01.816Z" }, + { url = "https://files.pythonhosted.org/packages/4c/58/60577569e198d56922b7ead07b465f559002b7b11d53f40937e95067ca1c/ruff-0.14.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:344d97172576d75dc6afc0e9243376dbe1668559c72de1864439c4fc95f78185", size = 14054487, upload-time = "2025-11-21T14:26:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/67/0b/8e4e0639e4cc12547f41cb771b0b44ec8225b6b6a93393176d75fe6f7d40/ruff-0.14.6-py3-none-win32.whl", hash = "sha256:00169c0c8b85396516fdd9ce3446c7ca20c2a8f90a77aa945ba6b8f2bfe99e85", size = 13013361, upload-time = "2025-11-21T14:26:08.152Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl", hash = "sha256:390e6480c5e3659f8a4c8d6a0373027820419ac14fa0d2713bd8e6c3e125b8b9", size = 14432087, upload-time = "2025-11-21T14:26:10.891Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1f/93f9b0fad9470e4c829a5bb678da4012f0c710d09331b860ee555216f4ea/ruff-0.14.6-py3-none-win_arm64.whl", hash = "sha256:d43c81fbeae52cfa8728d8766bbf46ee4298c888072105815b392da70ca836b2", size = 13520930, upload-time = "2025-11-21T14:26:13.951Z" }, ] [[package]] From 468e510f0d4da00ebc05a5b132b13e35db831737 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:33:10 -0800 Subject: [PATCH 18/32] Cleanup response logic --- bonsai/Bonsai.config | 8 +- src/Extensions/Main.bonsai | 251 ++++++++++++++++++++++++------------- 2 files changed, 169 insertions(+), 90 deletions(-) diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index 85b7b88..aa5ce67 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -4,7 +4,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -137,7 +137,7 @@ - + @@ -176,7 +176,7 @@ - + diff --git a/src/Extensions/Main.bonsai b/src/Extensions/Main.bonsai index 2bc0990..ed58ea0 100644 --- a/src/Extensions/Main.bonsai +++ b/src/Extensions/Main.bonsai @@ -42,10 +42,20 @@ - + + RigSchema + + + DataDirectory + + + + + + @@ -216,24 +226,27 @@ - + + + - - + + - + + @@ -401,69 +414,76 @@ - - - 1 - - EnableExperiment - - - - - RigSchema - - - RigName - - - - - - - - - Reply - + + Response + + + + IsExperimentRunning + + + + + + Source1 + + + + + + + + + + + 1 + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + OutboundMessages - - ZmqConnection - - - - - - - - MessageProtocolZmqTopic - - - - - - - - tcp://localhost:5557 - message_protocol + + 1 - - Last - - - - - - InboundMessages - - InboundMessages @@ -497,37 +517,104 @@ - - - 1 - - EndExperiment + + Response + + + + IsExperimentRunning + + + + + + + Source1 + + + + + + + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + + + + OutboundMessages + - + + 1 + - RigSchema + ZmqConnection - - RigName + + + + + + + MessageProtocolZmqTopic - + - - Reply + + tcp://localhost:5557 + message_protocol - - OutboundMessages + + Last + + + + + InboundMessages + + @@ -551,31 +638,23 @@ - - + - + + - + - - + - + + - - - - - - - - From c12b545439fab0137a25259fcadac6891095bd17 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 2 Dec 2025 15:41:13 -0800 Subject: [PATCH 19/32] Simplify rig schema --- examples/examples.py | 4 +- pyproject.toml | 2 +- .../aind_behavior_just_frames.json | 33 ++++------ .../AindBehaviorJustFrames.Generated.cs | 66 +------------------ .../message_protocol.py | 9 +-- src/aind_behavior_just_frames/regenerate.py | 3 +- src/aind_behavior_just_frames/rig.py | 14 +++- uv.lock | 4 +- 8 files changed, 35 insertions(+), 100 deletions(-) diff --git a/examples/examples.py b/examples/examples.py index 9d10ef8..b2d5124 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -1,5 +1,6 @@ import datetime import os +from pathlib import Path import aind_behavior_services.rig as rig from aind_behavior_services.session import AindBehaviorSessionModel @@ -11,10 +12,8 @@ def main(path_seed: str = "./local/{schema}.json"): this_session = AindBehaviorSessionModel( date=datetime.datetime.now(tz=datetime.timezone.utc), experiment="AindVideoEncodingBenchmarks", - root_path="c://", subject="Test", notes="test session", - experiment_version="0.0.0", allow_dirty_repo=False, skip_hardware_validation=False, experimenter=["Foo", "Bar"], @@ -27,6 +26,7 @@ def main(path_seed: str = "./local/{schema}.json"): ) this_rig = AindJustFramesRig( + data_directory=Path("C:/Data"), rig_name="this_rig", triggered_camera_controller_0=rig.cameras.CameraController[rig.cameras.SpinnakerCamera]( frame_rate=120, diff --git a/pyproject.toml b/pyproject.toml index 5add741..66d12de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.5.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services @git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@feat-update-session", + "aind_behavior_services @git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39", "pydantic-settings" ] diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index 8d25f0e..e26d504 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -178,15 +178,22 @@ "type": "boolean" }, "zmq_connection": { - "$ref": "#/$defs/ZmqPubSub", - "description": "ZMQ connection for communication." + "default": null, + "description": "ZMQ connection for communication.", + "oneOf": [ + { + "$ref": "#/$defs/ZmqPubSub" + }, + { + "type": "null" + } + ] } }, "required": [ "rig_name", "data_directory", - "harp_behavior", - "zmq_connection" + "harp_behavior" ], "title": "AindJustFramesRig", "type": "object" @@ -204,11 +211,6 @@ "title": "Device Type", "type": "string" }, - "name": { - "description": "Device name", - "title": "Name", - "type": "string" - }, "calibration": { "default": null, "description": "Calibration for the device.", @@ -245,7 +247,6 @@ } }, "required": [ - "name", "cameras" ], "title": "CameraController[SpinnakerCamera]", @@ -259,11 +260,6 @@ "title": "Device Type", "type": "string" }, - "name": { - "description": "Device name", - "title": "Name", - "type": "string" - }, "calibration": { "default": null, "description": "Calibration for the device.", @@ -302,7 +298,6 @@ } }, "required": [ - "name", "port_name" ], "title": "HarpBehavior", @@ -425,11 +420,6 @@ "title": "Device Type", "type": "string" }, - "name": { - "description": "Device name", - "title": "Name", - "type": "string" - }, "calibration": { "default": null, "description": "Calibration for the device.", @@ -540,7 +530,6 @@ } }, "required": [ - "name", "serial_number" ], "title": "SpinnakerCamera", diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index c803a5e..0213122 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -319,7 +319,6 @@ public AindJustFramesRig() _harpBehavior = new HarpBehavior(); _satelliteRigs = new System.Collections.Generic.List(); _isSatellite = false; - _zmqConnection = new ZmqPubSub(); } protected AindJustFramesRig(AindJustFramesRig other) @@ -504,7 +503,7 @@ public bool IsSatellite /// ZMQ connection for communication. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection")] [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] public ZmqPubSub ZmqConnection { @@ -611,8 +610,6 @@ public partial class CameraControllerSpinnakerCamera private string _deviceType; - private string _name; - private BaseModel _calibration; private System.Collections.Generic.Dictionary _cameras; @@ -628,7 +625,6 @@ public CameraControllerSpinnakerCamera() protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { _deviceType = other._deviceType; - _name = other._name; _calibration = other._calibration; _cameras = other._cameras; _frameRate = other._frameRate; @@ -647,23 +643,6 @@ public string DeviceType } } - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - /// /// Calibration for the device. /// @@ -731,7 +710,6 @@ public System.IObservable Generate(Sys protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Name = " + _name + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("Cameras = " + _cameras + ", "); stringBuilder.Append("FrameRate = " + _frameRate); @@ -761,8 +739,6 @@ public partial class HarpBehavior private string _deviceType; - private string _name; - private BaseModel _calibration; private int _whoAmI; @@ -780,7 +756,6 @@ public HarpBehavior() protected HarpBehavior(HarpBehavior other) { _deviceType = other._deviceType; - _name = other._name; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -800,23 +775,6 @@ public string DeviceType } } - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - /// /// Calibration for the device. /// @@ -895,7 +853,6 @@ public System.IObservable Generate(System.IObservable - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - /// /// Calibration for the device. /// @@ -1584,7 +1521,6 @@ public System.IObservable Generate(System.IObservable< protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Name = " + _name + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); stringBuilder.Append("Binning = " + _binning + ", "); diff --git a/src/aind_behavior_just_frames/message_protocol.py b/src/aind_behavior_just_frames/message_protocol.py index 55f4ffe..0a2cf60 100644 --- a/src/aind_behavior_just_frames/message_protocol.py +++ b/src/aind_behavior_just_frames/message_protocol.py @@ -1,25 +1,26 @@ from typing import Annotated, Any, Literal, Union from aind_behavior_services.message_protocol import HeartbeatPayload, LogPayload, _Message -from aind_behavior_just_frames.rig import SatelliteRig -from aind_behavior_services.session import AindBehaviorSessionModel from pydantic import BaseModel, ConfigDict, Field, RootModel, create_model ## This api is experimental and subject to change! + # ================================================================================ # Create custom messages for this platform class StartPayload(BaseModel): payload_type: Literal["Start"] = "Start" + class StopPayload(BaseModel): payload_type: Literal["Stop"] = "Stop" + # ================================================================================ # Register payloads into a protocol class RegisteredPayload(RootModel): root: Annotated[ - Union[StartPayload, StopPayload, LogPayload, HeartbeatPayload], + Union[StartPayload, StopPayload, LogPayload, HeartbeatPayload], Field(discriminator="payload_type", json_schema_extra={"x-abstract": True}), ] @@ -42,4 +43,4 @@ class MessageProtocol(BaseModel): model_config = ConfigDict(json_schema_extra={"x-abstract": True}) registered_message: RegisteredMessages - message: Message \ No newline at end of file + message: Message diff --git a/src/aind_behavior_just_frames/regenerate.py b/src/aind_behavior_just_frames/regenerate.py index dba241d..5fed95d 100644 --- a/src/aind_behavior_just_frames/regenerate.py +++ b/src/aind_behavior_just_frames/regenerate.py @@ -5,8 +5,8 @@ from aind_behavior_services.session import AindBehaviorSessionModel from aind_behavior_services.utils import BonsaiSgenSerializers, convert_pydantic_to_bonsai -from aind_behavior_just_frames.rig import AindJustFramesRig from aind_behavior_just_frames.message_protocol import MessageProtocol +from aind_behavior_just_frames.rig import AindJustFramesRig SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -41,6 +41,5 @@ def main(): ) - if __name__ == "__main__": main() diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 30aa75e..24e91fd 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -2,7 +2,7 @@ import aind_behavior_services.rig as rig from aind_behavior_services.rig import AindBehaviorRigModel -from pydantic import BaseModel, Field, field_validator +from pydantic import BaseModel, Field, field_validator, model_validator from . import __semver__ @@ -11,6 +11,7 @@ class ZmqPubSub(BaseModel): pub: rig.network.ZmqConnection = Field(description="ZMQ Publisher") sub: rig.network.ZmqConnection = Field(description="ZMQ Subscriber") + class SatelliteRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ computer_name: str = Field(description="Remote Computer name") @@ -50,4 +51,13 @@ class AindJustFramesRig(AindBehaviorRigModel): default_factory=list, min_length=1, description="List of satellite rigs." ) is_satellite: bool = Field(default=False) - zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") + zmq_connection: Optional[ZmqPubSub] = Field(default=None, description="ZMQ connection for communication.") + + @model_validator(mode="after") + def verify_zmq_nullability(self): + if self.zmq_connection is None: + if self.is_satellite: + raise ValueError("Satellite rigs must define a ZMQ connection.") + if len(self.satellite_rigs) > 0: + raise ValueError("Master rigs with satellite rigs must define a ZMQ connection.") + return self diff --git a/uv.lock b/uv.lock index 57bce32..0a833bd 100644 --- a/uv.lock +++ b/uv.lock @@ -64,7 +64,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session" }, + { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.2,<0.9.0" }, { name = "pydantic-settings" }, ] @@ -88,7 +88,7 @@ docs = [ [[package]] name = "aind-behavior-services" version = "0.13.0rc0" -source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session#e874dab47d70af621ad4dd01ebc3d41010f1d3cd" } +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39#0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, From bddd7e51e9bdf994d5621fb664b794ee7267fce4 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:05:39 -0800 Subject: [PATCH 20/32] Fix visualizer edge case --- src/Extensions/Main.bonsai | 9 +-------- .../SpinnakerCameraControllerSaturationVisualizer.bonsai | 7 +++---- src/Extensions/Visualizers.bonsai | 8 +++++--- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/Extensions/Main.bonsai b/src/Extensions/Main.bonsai index ed58ea0..7ff9b60 100644 --- a/src/Extensions/Main.bonsai +++ b/src/Extensions/Main.bonsai @@ -1218,14 +1218,8 @@ - - - 0 - - - JustFrames true @@ -1278,11 +1272,10 @@ - + - diff --git a/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai index c952fcf..41a522b 100644 --- a/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai +++ b/src/Extensions/SpinnakerCameraControllerSaturationVisualizer.bonsai @@ -9,7 +9,6 @@ xmlns:p2="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" xmlns:gui="clr-namespace:Bonsai.Gui;assembly=Bonsai.Gui" xmlns:p3="clr-namespace:AllenNeuralDynamics.VrForaging;assembly=AllenNeuralDynamics.Core.Design" - xmlns:p4="clr-namespace:Bonsai.Vision.Design;assembly=Bonsai.Vision.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -117,12 +116,12 @@ Value.Image - 5 - 250 + 1 + 254 1 - + diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai index 058b03d..afb4d37 100644 --- a/src/Extensions/Visualizers.bonsai +++ b/src/Extensions/Visualizers.bonsai @@ -6,10 +6,12 @@ xmlns="https://bonsai-rx.org/2018/workflow"> - - Source1 + + + 0 + - + Visualizers From 8bf3d83093e540da0f20a17ce0a12f97699130bf Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 2 Dec 2025 20:26:24 -0800 Subject: [PATCH 21/32] Solve race condition for configuration --- src/Extensions/Main.bonsai | 81 +++++++++++++++++++++++++++----------- src/main.bonsai | 14 ++----- src/satellite.bonsai | 14 ++----- 3 files changed, 64 insertions(+), 45 deletions(-) diff --git a/src/Extensions/Main.bonsai b/src/Extensions/Main.bonsai index 7ff9b60..4955b63 100644 --- a/src/Extensions/Main.bonsai +++ b/src/Extensions/Main.bonsai @@ -25,10 +25,39 @@ Main + + Source1 + + + + 1 + + + + ConfigurationInput + Init + + ConfigurationInput + + + Item1 + + + RigSchema + + + ConfigurationInput + + + Item2 + + + SubjectSchema + ../. @@ -225,28 +254,32 @@ - - + + - - - + + + + - + - - - + + + - + + + + @@ -1261,21 +1294,23 @@ - - - - - - - - - - - - + + + + + + + + + + + + - + + + diff --git a/src/main.bonsai b/src/main.bonsai index 5131c58..05af53e 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -29,9 +29,6 @@ - - RigSchema - @@ -46,9 +43,6 @@ - - SubjectSchema - @@ -58,14 +52,12 @@ - - + + - + - - diff --git a/src/satellite.bonsai b/src/satellite.bonsai index 15cf421..83f8db2 100644 --- a/src/satellite.bonsai +++ b/src/satellite.bonsai @@ -29,9 +29,6 @@ - - RigSchema - @@ -46,9 +43,6 @@ - - SubjectSchema - @@ -58,14 +52,12 @@ - - + + - + - - From 068dbe81e78220edded13d9fdd35e6aeb49fdc13 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 2 Dec 2025 20:27:52 -0800 Subject: [PATCH 22/32] Remove outdate readme information --- README.md | 50 -------------------------------------------------- 1 file changed, 50 deletions(-) diff --git a/README.md b/README.md index 11ff035..c35ca34 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,3 @@ # Aind.Behavior.JustFrames A repository with code for a online video acquisition/encoding pipeline - - -## Getting started - -The easiest way to get started is to clone this repository and run the `deploy.cmd` script. This script will install the necessary dependencies. If you use any python-dependent scripts (e.g. create settings json instances, `regenerate` or `clabe` commands), make sure to run them from an activated environment (`./.venv` directory in the root of the repo). - -To run the workflow you will need a valid set of schemas. Examples of how to generate these can be found in the `./examples/examples.py` file. For the most part, you will only need to generate the rig schema, as the others can be automatically generated using the `clabe` script. In summary: - -1. Generate the rig configuration by adapting the script in `./examples/examples.py`. You should make a copy of the example and modify it outside the repository directory, otherwise, any untracked changes / new files in the local repository will flag it as "dirty" and the benchmarks will not be allowed to run. -2. Once the schema is defined in the `.py` file, run the script to generate a valid `.json` file that will be the input to the benchmark workflow. -3. Copy and Paste the generated rig schema (i.e. the `.json` file) to the target config folder (by default `\\allen\aind\scratch\AindBehavior.db\AindBehaviorJustFrames\Rig\\.json`)/ -4. Run the `uv run just-frames clabe`, from the root of the repository, and follow the prompt. -5. Once Bonsai is running, double-click the `UserInterface` operator to open the GUI -6. Click Start (Stop) to start (stop) the benchmark workflow. - -Alternatively, you can run the `main.bonsai` script directly using the following command from the root of the repository: - -```cmd -"./bonsai/bonsai.exe" "./src/main.bonsai" -p RigPath="" -p SessionPath="" -``` - -where `` and `` are the paths to the rig and session schemas, respectively. - - - ---- - -## General instructions - -This repository follows the project structure laid out in the [Aind.Behavior.Services repository](https://github.com/AllenNeuralDynamics/Aind.Behavior.Services). - ---- - -## Deployment - -Deployment instructions can be found [here](https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?tab=readme-ov-file#deployment). - -Specifically, Ffmpeg and CUDA support must be installed on the computer. - ---- - -## Prerequisites - -Pre-requisites for running the project can be found [here](https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?tab=readme-ov-file#prerequisites). - ---- - -## Regenerating schemas - -Instructions for regenerating schemas can be found [here](https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?tab=readme-ov-file#regenerating-schemas). From 31b20d00645b07221c86b9b590f798fa12e5c3f6 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 2 Dec 2025 20:31:14 -0800 Subject: [PATCH 23/32] Update launcher dependencies --- pyproject.toml | 3 +- src/aind_behavior_just_frames/launcher.py | 12 +-- uv.lock | 103 +++++++++++++++------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 66d12de..26c9c6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,8 +22,7 @@ dependencies = [ [project.optional-dependencies] -launcher = ["aind-clabe[aind-services] >= 0.8.2 ,<0.9.0"] - +launcher = ["aind-clabe[aind-services] >= 0.9 ,<0.10.0"] [dependency-groups] diff --git a/src/aind_behavior_just_frames/launcher.py b/src/aind_behavior_just_frames/launcher.py index 3ede67d..b592f54 100644 --- a/src/aind_behavior_just_frames/launcher.py +++ b/src/aind_behavior_just_frames/launcher.py @@ -5,7 +5,6 @@ from clabe import resource_monitor from clabe.apps import ( AindBehaviorServicesBonsaiApp, - BonsaiAppSettings, ) from clabe.data_transfer import robocopy from clabe.launcher import Launcher, LauncherCliArgs @@ -31,12 +30,15 @@ def experiment(launcher: Launcher) -> None: session = picker.pick_session(AindBehaviorSessionModel) launcher.register_session(session) rig = picker.pick_rig(AindJustFramesRig) - bonsai_app = AindBehaviorServicesBonsaiApp(BonsaiAppSettings(workflow=Path(r"./src/main.bonsai"))) - bonsai_app.add_app_settings(launcher, rig=rig, session=session) - bonsai_app.get_result(allow_stderr=True) + bonsai_app = AindBehaviorServicesBonsaiApp( + workflow=Path(r"./src/main.bonsai"), + rig=rig, + session=session, + ) + bonsai_app.run() launcher.copy_logs() - robocopy.RobocopyService(source=launcher.session_directory, settings=robocopy.RobocopySettings()) + robocopy.RobocopyService(source=launcher.session_directory, settings=robocopy.RobocopySettings()).transfer() return diff --git a/uv.lock b/uv.lock index 0a833bd..fb8cfdf 100644 --- a/uv.lock +++ b/uv.lock @@ -65,7 +65,7 @@ docs = [ [package.metadata] requires-dist = [ { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.2,<0.9.0" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9,<0.10.0" }, { name = "pydantic-settings" }, ] provides-extras = ["launcher"] @@ -99,19 +99,21 @@ dependencies = [ [[package]] name = "aind-clabe" -version = "0.8.3" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "questionary" }, + { name = "requests" }, { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/3a/7d03c8b72d22dabc876de4d0bd75a12711f5ea07369c93f561081ef2b710/aind_clabe-0.8.3.tar.gz", hash = "sha256:68cbea735a73e6cb592dbf490d7efe52573d6464bd236b3b777c29ac5fb1ea7e", size = 48656, upload-time = "2025-10-24T17:40:36.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/c1/77cbabec001fa93b558eee34530a0c88eb7f959e10cdfcaacea93496b0e4/aind_clabe-0.9.0.tar.gz", hash = "sha256:732c68e664a84ca933085c44fccb6db782411dacc31d433e2d86c43030b08179", size = 68200, upload-time = "2025-11-18T02:12:32.817Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/58/6c4f436c2e0b97b6c0264c9fcd4e34412da972ef491c84499de079bc3fc1/aind_clabe-0.8.3-py3-none-any.whl", hash = "sha256:569b7e2bae8ae036d05e428772bbb13215e0892b7456cbf3ac1598d9ff0664c9", size = 66200, upload-time = "2025-10-24T17:40:35.575Z" }, + { url = "https://files.pythonhosted.org/packages/25/cc/975079dd0910d40ada6e4d1f40093ef2d5a18ff8f25df243138ad84076c3/aind_clabe-0.9.0-py3-none-any.whl", hash = "sha256:e09e6f23c421fcd2f68e86639fe1adff84a5cdf46fa9fe6ee36e4840a6c0e036", size = 91335, upload-time = "2025-11-18T02:12:31.731Z" }, ] [package.optional-dependencies] @@ -261,15 +263,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.14.2" +version = "4.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, ] [[package]] @@ -1085,6 +1087,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + [[package]] name = "pyasn1" version = "0.6.1" @@ -1165,7 +1179,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.4" +version = "2.12.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1173,9 +1187,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/ad/a17bc283d7d81837c061c49e3eaa27a45991759a1b7eae1031921c6bd924/pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac", size = 821038, upload-time = "2025-11-05T10:50:08.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/2f/e68750da9b04856e2a7ec56fc6f034a5a79775e9b9a81882252789873798/pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e", size = 463400, upload-time = "2025-11-05T10:50:06.732Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] [[package]] @@ -1442,6 +1456,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "questionary" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/45/eafb0bba0f9988f6a2520f9ca2df2c82ddfa8d67c95d6625452e97b204a5/questionary-2.1.1.tar.gz", hash = "sha256:3d7e980292bb0107abaa79c68dd3eee3c561b83a0f89ae482860b181c8bd412d", size = 25845, upload-time = "2025-08-28T19:00:20.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -1541,28 +1567,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/f0/62b5a1a723fe183650109407fa56abb433b00aa1c0b9ba555f9c4efec2c6/ruff-0.14.6.tar.gz", hash = "sha256:6f0c742ca6a7783a736b867a263b9a7a80a45ce9bee391eeda296895f1b4e1cc", size = 5669501, upload-time = "2025-11-21T14:26:17.903Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d2/7dd544116d107fffb24a0064d41a5d2ed1c9d6372d142f9ba108c8e39207/ruff-0.14.6-py3-none-linux_armv6l.whl", hash = "sha256:d724ac2f1c240dbd01a2ae98db5d1d9a5e1d9e96eba999d1c48e30062df578a3", size = 13326119, upload-time = "2025-11-21T14:25:24.2Z" }, - { url = "https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9f7539ea257aa4d07b7ce87aed580e485c40143f2473ff2f2b75aee003186004", size = 13526007, upload-time = "2025-11-21T14:25:26.906Z" }, - { url = "https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7f6007e55b90a2a7e93083ba48a9f23c3158c433591c33ee2e99a49b889c6332", size = 12676572, upload-time = "2025-11-21T14:25:29.826Z" }, - { url = "https://files.pythonhosted.org/packages/76/a4/f319e87759949062cfee1b26245048e92e2acce900ad3a909285f9db1859/ruff-0.14.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8e7b9d73d8728b68f632aa8e824ef041d068d231d8dbc7808532d3629a6bef", size = 13140745, upload-time = "2025-11-21T14:25:32.788Z" }, - { url = "https://files.pythonhosted.org/packages/95/d3/248c1efc71a0a8ed4e8e10b4b2266845d7dfc7a0ab64354afe049eaa1310/ruff-0.14.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d50d45d4553a3ebcbd33e7c5e0fe6ca4aafd9a9122492de357205c2c48f00775", size = 13076486, upload-time = "2025-11-21T14:25:35.601Z" }, - { url = "https://files.pythonhosted.org/packages/a5/19/b68d4563fe50eba4b8c92aa842149bb56dd24d198389c0ed12e7faff4f7d/ruff-0.14.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:118548dd121f8a21bfa8ab2c5b80e5b4aed67ead4b7567790962554f38e598ce", size = 13727563, upload-time = "2025-11-21T14:25:38.514Z" }, - { url = "https://files.pythonhosted.org/packages/47/ac/943169436832d4b0e867235abbdb57ce3a82367b47e0280fa7b4eabb7593/ruff-0.14.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:57256efafbfefcb8748df9d1d766062f62b20150691021f8ab79e2d919f7c11f", size = 15199755, upload-time = "2025-11-21T14:25:41.516Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b9/288bb2399860a36d4bb0541cb66cce3c0f4156aaff009dc8499be0c24bf2/ruff-0.14.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff18134841e5c68f8e5df1999a64429a02d5549036b394fafbe410f886e1989d", size = 14850608, upload-time = "2025-11-21T14:25:44.428Z" }, - { url = "https://files.pythonhosted.org/packages/ee/b1/a0d549dd4364e240f37e7d2907e97ee80587480d98c7799d2d8dc7a2f605/ruff-0.14.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c4b7ec1e66a105d5c27bd57fa93203637d66a26d10ca9809dc7fc18ec58440", size = 14118754, upload-time = "2025-11-21T14:25:47.214Z" }, - { url = "https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167843a6f78680746d7e226f255d920aeed5e4ad9c03258094a2d49d3028b105", size = 13949214, upload-time = "2025-11-21T14:25:50.002Z" }, - { url = "https://files.pythonhosted.org/packages/12/27/4dad6c6a77fede9560b7df6802b1b697e97e49ceabe1f12baf3ea20862e9/ruff-0.14.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:16a33af621c9c523b1ae006b1b99b159bf5ac7e4b1f20b85b2572455018e0821", size = 14106112, upload-time = "2025-11-21T14:25:52.841Z" }, - { url = "https://files.pythonhosted.org/packages/6a/db/23e322d7177873eaedea59a7932ca5084ec5b7e20cb30f341ab594130a71/ruff-0.14.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1432ab6e1ae2dc565a7eea707d3b03a0c234ef401482a6f1621bc1f427c2ff55", size = 13035010, upload-time = "2025-11-21T14:25:55.536Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9c/20e21d4d69dbb35e6a1df7691e02f363423658a20a2afacf2a2c011800dc/ruff-0.14.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c55cfbbe7abb61eb914bfd20683d14cdfb38a6d56c6c66efa55ec6570ee4e71", size = 13054082, upload-time = "2025-11-21T14:25:58.625Z" }, - { url = "https://files.pythonhosted.org/packages/66/25/906ee6a0464c3125c8d673c589771a974965c2be1a1e28b5c3b96cb6ef88/ruff-0.14.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:efea3c0f21901a685fff4befda6d61a1bf4cb43de16da87e8226a281d614350b", size = 13303354, upload-time = "2025-11-21T14:26:01.816Z" }, - { url = "https://files.pythonhosted.org/packages/4c/58/60577569e198d56922b7ead07b465f559002b7b11d53f40937e95067ca1c/ruff-0.14.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:344d97172576d75dc6afc0e9243376dbe1668559c72de1864439c4fc95f78185", size = 14054487, upload-time = "2025-11-21T14:26:05.058Z" }, - { url = "https://files.pythonhosted.org/packages/67/0b/8e4e0639e4cc12547f41cb771b0b44ec8225b6b6a93393176d75fe6f7d40/ruff-0.14.6-py3-none-win32.whl", hash = "sha256:00169c0c8b85396516fdd9ce3446c7ca20c2a8f90a77aa945ba6b8f2bfe99e85", size = 13013361, upload-time = "2025-11-21T14:26:08.152Z" }, - { url = "https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl", hash = "sha256:390e6480c5e3659f8a4c8d6a0373027820419ac14fa0d2713bd8e6c3e125b8b9", size = 14432087, upload-time = "2025-11-21T14:26:10.891Z" }, - { url = "https://files.pythonhosted.org/packages/a5/1f/93f9b0fad9470e4c829a5bb678da4012f0c710d09331b860ee555216f4ea/ruff-0.14.6-py3-none-win_arm64.whl", hash = "sha256:d43c81fbeae52cfa8728d8766bbf46ee4298c888072105815b392da70ca836b2", size = 13520930, upload-time = "2025-11-21T14:26:13.951Z" }, +version = "0.14.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/5b/dd7406afa6c95e3d8fa9d652b6d6dd17dd4a6bf63cb477014e8ccd3dcd46/ruff-0.14.7.tar.gz", hash = "sha256:3417deb75d23bd14a722b57b0a1435561db65f0ad97435b4cf9f85ffcef34ae5", size = 5727324, upload-time = "2025-11-28T20:55:10.525Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/b1/7ea5647aaf90106f6d102230e5df874613da43d1089864da1553b899ba5e/ruff-0.14.7-py3-none-linux_armv6l.whl", hash = "sha256:b9d5cb5a176c7236892ad7224bc1e63902e4842c460a0b5210701b13e3de4fca", size = 13414475, upload-time = "2025-11-28T20:54:54.569Z" }, + { url = "https://files.pythonhosted.org/packages/af/19/fddb4cd532299db9cdaf0efdc20f5c573ce9952a11cb532d3b859d6d9871/ruff-0.14.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3f64fe375aefaf36ca7d7250292141e39b4cea8250427482ae779a2aa5d90015", size = 13634613, upload-time = "2025-11-28T20:55:17.54Z" }, + { url = "https://files.pythonhosted.org/packages/40/2b/469a66e821d4f3de0440676ed3e04b8e2a1dc7575cf6fa3ba6d55e3c8557/ruff-0.14.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:93e83bd3a9e1a3bda64cb771c0d47cda0e0d148165013ae2d3554d718632d554", size = 12765458, upload-time = "2025-11-28T20:55:26.128Z" }, + { url = "https://files.pythonhosted.org/packages/f1/05/0b001f734fe550bcfde4ce845948ac620ff908ab7241a39a1b39bb3c5f49/ruff-0.14.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3838948e3facc59a6070795de2ae16e5786861850f78d5914a03f12659e88f94", size = 13236412, upload-time = "2025-11-28T20:55:28.602Z" }, + { url = "https://files.pythonhosted.org/packages/11/36/8ed15d243f011b4e5da75cd56d6131c6766f55334d14ba31cce5461f28aa/ruff-0.14.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24c8487194d38b6d71cd0fd17a5b6715cda29f59baca1defe1e3a03240f851d1", size = 13182949, upload-time = "2025-11-28T20:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cf/fcb0b5a195455729834f2a6eadfe2e4519d8ca08c74f6d2b564a4f18f553/ruff-0.14.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79c73db6833f058a4be8ffe4a0913b6d4ad41f6324745179bd2aa09275b01d0b", size = 13816470, upload-time = "2025-11-28T20:55:08.203Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5d/34a4748577ff7a5ed2f2471456740f02e86d1568a18c9faccfc73bd9ca3f/ruff-0.14.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:12eb7014fccff10fc62d15c79d8a6be4d0c2d60fe3f8e4d169a0d2def75f5dad", size = 15289621, upload-time = "2025-11-28T20:55:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/53/53/0a9385f047a858ba133d96f3f8e3c9c66a31cc7c4b445368ef88ebeac209/ruff-0.14.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c623bbdc902de7ff715a93fa3bb377a4e42dd696937bf95669118773dbf0c50", size = 14975817, upload-time = "2025-11-28T20:55:24.107Z" }, + { url = "https://files.pythonhosted.org/packages/a8/d7/2f1c32af54c3b46e7fadbf8006d8b9bcfbea535c316b0bd8813d6fb25e5d/ruff-0.14.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f53accc02ed2d200fa621593cdb3c1ae06aa9b2c3cae70bc96f72f0000ae97a9", size = 14284549, upload-time = "2025-11-28T20:55:06.08Z" }, + { url = "https://files.pythonhosted.org/packages/92/05/434ddd86becd64629c25fb6b4ce7637dd52a45cc4a4415a3008fe61c27b9/ruff-0.14.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:281f0e61a23fcdcffca210591f0f53aafaa15f9025b5b3f9706879aaa8683bc4", size = 14071389, upload-time = "2025-11-28T20:55:35.617Z" }, + { url = "https://files.pythonhosted.org/packages/ff/50/fdf89d4d80f7f9d4f420d26089a79b3bb1538fe44586b148451bc2ba8d9c/ruff-0.14.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:dbbaa5e14148965b91cb090236931182ee522a5fac9bc5575bafc5c07b9f9682", size = 14202679, upload-time = "2025-11-28T20:55:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/77/54/87b34988984555425ce967f08a36df0ebd339bb5d9d0e92a47e41151eafc/ruff-0.14.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1464b6e54880c0fe2f2d6eaefb6db15373331414eddf89d6b903767ae2458143", size = 13147677, upload-time = "2025-11-28T20:55:19.933Z" }, + { url = "https://files.pythonhosted.org/packages/67/29/f55e4d44edfe053918a16a3299e758e1c18eef216b7a7092550d7a9ec51c/ruff-0.14.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f217ed871e4621ea6128460df57b19ce0580606c23aeab50f5de425d05226784", size = 13151392, upload-time = "2025-11-28T20:55:21.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/69/47aae6dbd4f1d9b4f7085f4d9dcc84e04561ee7ad067bf52e0f9b02e3209/ruff-0.14.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6be02e849440ed3602d2eb478ff7ff07d53e3758f7948a2a598829660988619e", size = 13412230, upload-time = "2025-11-28T20:55:12.749Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4b/6e96cb6ba297f2ba502a231cd732ed7c3de98b1a896671b932a5eefa3804/ruff-0.14.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19a0f116ee5e2b468dfe80c41c84e2bbd6b74f7b719bee86c2ecde0a34563bcc", size = 14195397, upload-time = "2025-11-28T20:54:56.896Z" }, + { url = "https://files.pythonhosted.org/packages/69/82/251d5f1aa4dcad30aed491b4657cecd9fb4274214da6960ffec144c260f7/ruff-0.14.7-py3-none-win32.whl", hash = "sha256:e33052c9199b347c8937937163b9b149ef6ab2e4bb37b042e593da2e6f6cccfa", size = 13126751, upload-time = "2025-11-28T20:55:03.47Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b5/d0b7d145963136b564806f6584647af45ab98946660d399ec4da79cae036/ruff-0.14.7-py3-none-win_amd64.whl", hash = "sha256:e17a20ad0d3fad47a326d773a042b924d3ac31c6ca6deb6c72e9e6b5f661a7c6", size = 14531726, upload-time = "2025-11-28T20:54:59.121Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d2/1637f4360ada6a368d3265bf39f2cf737a0aaab15ab520fc005903e883f8/ruff-0.14.7-py3-none-win_arm64.whl", hash = "sha256:be4d653d3bea1b19742fcc6502354e32f65cd61ff2fbdb365803ef2c2aec6228", size = 13609215, upload-time = "2025-11-28T20:55:15.375Z" }, ] [[package]] @@ -1698,7 +1724,7 @@ wheels = [ [[package]] name = "sphinx-jsonschema" -version = "1.19.1" +version = "1.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1706,7 +1732,7 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/3f/559d054f977596c5535edfeeab1f3a278f3bbb81bada2a1cb3cadbf7bb67/sphinx-jsonschema-1.19.1.tar.gz", hash = "sha256:b2385fe1c7acf2e759152aefed0cb17c920645b2a75c9934000c9c528e7d53c1", size = 18599, upload-time = "2022-05-01T12:42:58.089Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/03/15c1d632e6671ae07a8689ce84c6c72d7849cca13ec32bc68c2e3d6f6f08/sphinx_jsonschema-1.19.2.tar.gz", hash = "sha256:1a48954217c2b3c6759c89b9ddd2c8e5b668b8730564e0283b009f23932be150", size = 30550, upload-time = "2025-12-01T08:54:33.726Z" } [[package]] name = "sphinxcontrib-applehelp" @@ -1825,6 +1851,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "winkerberos" version = "0.12.2" From 613c4ec73baece8b2b2bc2cc8e4e9f3e54c0aeec Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:25:56 -0800 Subject: [PATCH 24/32] Add qc routine --- pyproject.toml | 7 +- src/aind_behavior_just_frames/cli.py | 10 +- .../data_contract/__init__.py | 45 ++ .../data_contract/v0_5_0.py | 137 +++++ .../data_qc/__init__.py | 32 ++ .../data_qc/data_qc.py | 77 +++ uv.lock | 526 +++++++++++++++++- 7 files changed, 822 insertions(+), 12 deletions(-) create mode 100644 src/aind_behavior_just_frames/data_contract/__init__.py create mode 100644 src/aind_behavior_just_frames/data_contract/v0_5_0.py create mode 100644 src/aind_behavior_just_frames/data_qc/__init__.py create mode 100644 src/aind_behavior_just_frames/data_qc/data_qc.py diff --git a/pyproject.toml b/pyproject.toml index 26c9c6c..be1e78c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,11 +22,14 @@ dependencies = [ [project.optional-dependencies] -launcher = ["aind-clabe[aind-services] >= 0.9 ,<0.10.0"] +data = ["contraqctor >= 0.5.3 ,<0.6.0"] +launcher = [ + "aind-clabe[aind-services] >= 0.9 ,<0.10.0", + "aind_behavior_just_frames[data]",] [dependency-groups] -dev = ["aind_behavior_just_frames[launcher]", +dev = ["aind_behavior_just_frames[launcher, data]", "ruff", "codespell" ] diff --git a/src/aind_behavior_just_frames/cli.py b/src/aind_behavior_just_frames/cli.py index 89231fb..b95f4cb 100644 --- a/src/aind_behavior_just_frames/cli.py +++ b/src/aind_behavior_just_frames/cli.py @@ -4,6 +4,7 @@ from pydantic_settings import BaseSettings, CliApp, CliSubCommand from aind_behavior_just_frames import __semver__, regenerate +from aind_behavior_just_frames.data_qc import DataQcCli from aind_behavior_just_frames.launcher import ClabeCli @@ -21,12 +22,13 @@ def cli_cmd(self) -> None: regenerate.main() -class VrForagingCli(BaseSettings, cli_prog_name="vr-foraging", cli_kebab_case=True): +class JustFramesCli(BaseSettings, cli_prog_name="just-frames", cli_kebab_case=True): version: CliSubCommand[VersionCli] = Field( - description="Print the version of the vr-foraging package.", + description="Print the version of the just-frames package.", ) + data_qc: CliSubCommand[DataQcCli] = Field(description="Run data quality checks.") regenerate: CliSubCommand[DslRegenerateCli] = Field( - description="Regenerate the vr-foraging dsl dependencies.", + description="Regenerate the just-frames dsl dependencies.", ) clabe: CliSubCommand[ClabeCli] = Field( description="Run the Clabe CLI.", @@ -37,7 +39,7 @@ def cli_cmd(self): def main(): - CliApp().run(VrForagingCli) + CliApp().run(JustFramesCli) if __name__ == "__main__": diff --git a/src/aind_behavior_just_frames/data_contract/__init__.py b/src/aind_behavior_just_frames/data_contract/__init__.py new file mode 100644 index 0000000..8e668d4 --- /dev/null +++ b/src/aind_behavior_just_frames/data_contract/__init__.py @@ -0,0 +1,45 @@ +import os +import typing as t +from functools import partial +from pathlib import Path + +import contraqctor +import semver + +from aind_behavior_just_frames import __semver__ + + +def _dataset_lookup_helper(version: str) -> t.Callable[[Path], contraqctor.contract.Dataset]: + parsed_version = semver.Version.parse(version) + # Ignore release candidate suffix for version comparison + parsed_version = semver.Version(parsed_version.major, parsed_version.minor, parsed_version.patch) + if parsed_version >= semver.Version.parse("0.5.0"): + from .v0_5_0 import dataset as _dataset + else: + raise ValueError(f"Unsupported version: {version}") + return partial(_dataset, version=version) + + +def dataset(path: os.PathLike, version: str = __semver__) -> contraqctor.contract.Dataset: + """ + Loads the dataset for the Aind Just Frames project from a specified version. + + Args: + path (os.PathLike): The path to the dataset root directory. + version (str): The version of the dataset to load. By default, it uses the package version. + + Returns: + contraqctor.contract.Dataset: The loaded dataset. + """ + dataset_constructor = _dataset_lookup_helper(version) + return dataset_constructor(Path(path)) + + +def render_dataset(version: str = __semver__) -> str: + """Renders the dataset as a tree-like structure for visualization.""" + from contraqctor.contract.utils import print_data_stream_tree_html + + dataset_constructor = _dataset_lookup_helper(version) + return print_data_stream_tree_html( + dataset_constructor(Path("")), show_missing_indicator=False, show_type=True + ) diff --git a/src/aind_behavior_just_frames/data_contract/v0_5_0.py b/src/aind_behavior_just_frames/data_contract/v0_5_0.py new file mode 100644 index 0000000..a556bf5 --- /dev/null +++ b/src/aind_behavior_just_frames/data_contract/v0_5_0.py @@ -0,0 +1,137 @@ +from pathlib import Path + +from aind_behavior_services.session import AindBehaviorSessionModel +from contraqctor.contract import Dataset, DataStreamCollection +from contraqctor.contract.camera import Camera +from contraqctor.contract.harp import ( + DeviceYmlByFile, + HarpDevice, +) +from contraqctor.contract.json import PydanticModel, SoftwareEvents +from contraqctor.contract.mux import MapFromPaths +from contraqctor.contract.text import Text + +from aind_behavior_just_frames.rig import AindJustFramesRig + + +def dataset( + root_path: Path, + name: str = "JustFramesDataset", + description: str = "A JustFrames dataset", + version: str = "0.5.0", +) -> Dataset: + """ + Creates a Dataset object for the JustFrames experiment. + This function constructs a hierarchical representation of the data streams collected + during a JustFrames experiment, including hardware device data, software events, + and configuration files. + Parameters + ---------- + root_path : Path + Path to the root directory containing the dataset + name : str, optional + Name of the dataset, defaults to "JustFramesDataset" + description : str, optional + Description of the dataset, defaults to "A JustFrames dataset" + version : str, optional + Version of the dataset, defaults to the package version (This is also the version of the experiment) + Returns + ------- + Dataset + A Dataset object containing a hierarchical representation of all data streams + from the JustFrames experiment, including: + - Camera/Video (meta)data + - Log files + - Configuration schemas (rig, session) + """ + + root_path = Path(root_path) + return Dataset( + name=name, + version=version, + description=description, + data_streams=[ + DataStreamCollection( + name="Behavior", + description="Data from the Behavior modality", + data_streams=[ + HarpDevice( + name="HarpBehavior", + reader_params=HarpDevice.make_params( + path=root_path / "behavior/Behavior.harp", + device_yml_hint=DeviceYmlByFile(), + ), + ), + DataStreamCollection( + name="HarpCommands", + description="Commands sent to Harp devices", + data_streams=[ + HarpDevice( + name="HarpBehavior", + reader_params=HarpDevice.make_params( + path=root_path / "behavior/HarpCommands/Behavior.harp", + device_yml_hint=DeviceYmlByFile(), + ), + ) + ], + ), + DataStreamCollection( + name="SoftwareEvents", + description="Software events generated by the workflow. The timestamps of these events are low precision and should not be used to align to physiology data.", + data_streams=[], + ), + DataStreamCollection( + name="Logs", + data_streams=[ + Text( + name="Launcher", + description="Contains the console log of the launcher process.", + reader_params=Text.make_params( + path=root_path / "behavior/Logs/.launcher/launcher.log", + ), + ), + SoftwareEvents( + name="EndSession", + description="A file that determines the end of the session. If the file is empty, the session is still running or it was not closed properly.", + reader_params=SoftwareEvents.make_params( + path=root_path / "behavior/Logs/EndSession.json", + ), + ), + ], + ), + DataStreamCollection( + name="InputSchemas", + description="Configuration files for the behavior rig, task_logic and session.", + data_streams=[ + PydanticModel( + name="Rig", + reader_params=PydanticModel.make_params( + model=AindJustFramesRig, + path=root_path / "behavior/Logs/rig_input.json", + ), + ), + PydanticModel( + name="Session", + reader_params=PydanticModel.make_params( + model=AindBehaviorSessionModel, + path=root_path / "behavior/Logs/session_input.json", + ), + ), + ], + ), + ], + ), + MapFromPaths( + name="BehaviorVideos", + description="Data from BehaviorVideos modality", + reader_params=MapFromPaths.make_params( + paths=root_path / "behavior-videos", + include_glob_pattern=["*"], + inner_data_stream=Camera, + inner_param_factory=lambda camera_name: Camera.make_params( + path=root_path / "behavior-videos" / camera_name + ), + ), + ), + ], + ) diff --git a/src/aind_behavior_just_frames/data_qc/__init__.py b/src/aind_behavior_just_frames/data_qc/__init__.py new file mode 100644 index 0000000..c0bdbdb --- /dev/null +++ b/src/aind_behavior_just_frames/data_qc/__init__.py @@ -0,0 +1,32 @@ +import logging +import os +from pathlib import Path + +from pydantic import Field +from pydantic_settings import BaseSettings, CliPositionalArg + +from aind_behavior_just_frames import __semver__ + +logger = logging.getLogger(__name__) + + +class DataQcCli(BaseSettings, cli_kebab_case=True): + data_path: CliPositionalArg[os.PathLike] = Field(description="Path to the session data directory.") + version: str = Field(default=__semver__, description="Version of the dataset.") + report_path: Path | None = Field( + default=None, description="Path to save the Html QC report. If not provided, report is not saved." + ) + + def cli_cmd(self): + """Run data quality checks on the dataset located at the specified path.""" + from ..data_contract import dataset + from .data_qc import make_qc_runner + + _dataset = dataset(Path(self.data_path), self.version) + runner = make_qc_runner(_dataset) + results = runner.run_all_with_progress() + if report_path := self.report_path: + from contraqctor.qc.reporters import HtmlReporter + + reporter = HtmlReporter(output_path=report_path) + reporter.report_results(results, serialize_context_exportable_obj=True) diff --git a/src/aind_behavior_just_frames/data_qc/data_qc.py b/src/aind_behavior_just_frames/data_qc/data_qc.py new file mode 100644 index 0000000..f42111f --- /dev/null +++ b/src/aind_behavior_just_frames/data_qc/data_qc.py @@ -0,0 +1,77 @@ +import logging +import typing as t + +import pandas as pd +from contraqctor import contract, qc +from contraqctor.contract.harp import HarpDevice + +from aind_behavior_just_frames.rig import AindJustFramesRig + +logger = logging.getLogger(__name__) + + +class JustFramesQcSuite(qc.Suite): + def __init__(self, dataset: contract.Dataset): + self.dataset = dataset + + def test_end_session_exists(self): + """Check that the session has an end event.""" + end_session = self.dataset["Behavior"]["Logs"]["EndSession"] + + if not end_session.has_data: + return self.fail_test( + None, "EndSession event does not exist. Session may be corrupted or not ended properly." + ) + + assert isinstance(end_session.data, pd.DataFrame) + if end_session.data.empty: + return self.fail_test(None, "No data in EndSession. Session may be corrupted or not ended properly.") + else: + return self.pass_test(None, "EndSession event exists with data.") + + +def make_qc_runner(dataset: contract.Dataset) -> qc.Runner: + _runner = qc.Runner() + dataset.load_all(strict=False) + exclude: list[contract.DataStream] = [] + rig: AindJustFramesRig = dataset["Behavior"]["InputSchemas"]["Rig"].data + + # Exclude commands to Harp boards as these are tested separately + for cmd in dataset["Behavior"]["HarpCommands"]: + for stream in cmd: + if isinstance(stream, contract.harp.HarpRegister): + exclude.append(stream) + + # Add the outcome of the dataset loading step to the automatic qc + _runner.add_suite(qc.contract.ContractTestSuite(dataset.collect_errors(), exclude=exclude), group="Data contract") + + # Add Harp tests for ALL Harp devices in the dataset + for stream in (_r := dataset["Behavior"]): + if isinstance(stream, HarpDevice): + commands = t.cast(HarpDevice, _r["HarpCommands"][stream.name]) + _runner.add_suite(qc.harp.HarpDeviceTestSuite(stream, commands), stream.name) + + # Add camera qc + for camera in dataset["BehaviorVideos"]: + if rig.triggered_camera_controller_0 is not None and camera.name in rig.triggered_camera_controller_0.cameras: + controller = rig.triggered_camera_controller_0 + elif rig.triggered_camera_controller_1 is not None and camera.name in rig.triggered_camera_controller_1.cameras: + controller = rig.triggered_camera_controller_1 + else: + logger.warning("Camera %s not found in any triggered camera controller.", camera.name) + continue + + _runner.add_suite( + qc.camera.CameraTestSuite(camera, expected_fps=controller.frame_rate, saturation_bounds=(1, 254)), + camera.name, + ) + + # Add Csv tests + csv_streams = [stream for stream in dataset.iter_all() if isinstance(stream, contract.csv.Csv)] + for stream in csv_streams: + _runner.add_suite(qc.csv.CsvTestSuite(stream), stream.name) + + # Add the Just Frames specific tests + _runner.add_suite(JustFramesQcSuite(dataset), "JustFrames") + + return _runner diff --git a/uv.lock b/uv.lock index fb8cfdf..9a94719 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version < '3.12'", + "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'darwin'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", + "(python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version < '3.12' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform != 'darwin' and sys_platform != 'linux')", ] [[package]] @@ -43,13 +49,17 @@ dependencies = [ ] [package.optional-dependencies] +data = [ + { name = "contraqctor" }, +] launcher = [ { name = "aind-clabe", extra = ["aind-services"] }, + { name = "contraqctor" }, ] [package.dev-dependencies] dev = [ - { name = "aind-behavior-just-frames", extra = ["launcher"] }, + { name = "aind-behavior-just-frames", extra = ["data", "launcher"] }, { name = "codespell" }, { name = "ruff" }, ] @@ -64,15 +74,17 @@ docs = [ [package.metadata] requires-dist = [ + { name = "aind-behavior-just-frames", extras = ["data"], marker = "extra == 'launcher'" }, { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9,<0.10.0" }, + { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, ] -provides-extras = ["launcher"] +provides-extras = ["data", "launcher"] [package.metadata.requires-dev] dev = [ - { name = "aind-behavior-just-frames", extras = ["launcher"] }, + { name = "aind-behavior-just-frames", extras = ["launcher", "data"] }, { name = "codespell" }, { name = "ruff" }, ] @@ -465,6 +477,112 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl", hash = "sha256:c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30", size = 63020, upload-time = "2023-11-29T08:44:46.876Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "contraqctor" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-behavior-services" }, + { name = "harp-python" }, + { name = "jinja2" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "opencv-python" }, + { name = "pandas" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "scipy" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/33/e0dfd99fc23ab1ac6162b496727edef844e9279e13a969b05a1b4b05d426/contraqctor-0.5.3.tar.gz", hash = "sha256:0d11e4cf50acf01288b5ed66053211105c3a716fe8a31d63bcc2bf423037ac20", size = 54226, upload-time = "2025-11-10T17:31:19.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/9a/94fa67d2aecf7703a68be18b97b8d1af09ec9c26c73b2c21d5e881e46353/contraqctor-0.5.3-py3-none-any.whl", hash = "sha256:9306521efd6165007409319be39d4a8d9e286028693237584dbfc9f87e974292", size = 67638, upload-time = "2025-11-10T17:31:18.482Z" }, +] + [[package]] name = "cryptography" version = "46.0.3" @@ -527,6 +645,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, ] +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + [[package]] name = "dnspython" version = "2.8.0" @@ -576,6 +703,55 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/ee/dc88399e2a872fd7ce5a192cfbcf8bd996574bb6c7470912c8c2fca20527/erdantic-1.2.0-py3-none-any.whl", hash = "sha256:7c67adcf22150b77a24609734c7efc676f71824f8f5662fd21450ec1cdbe0a0c", size = 34428, upload-time = "2025-09-15T18:07:09.766Z" }, ] +[[package]] +name = "fonttools" +version = "4.61.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, + { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, + { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, + { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, + { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, + { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, + { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, + { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, + { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, + { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, + { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, + { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, + { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, + { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, + { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, + { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, + { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, + { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, + { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +] + [[package]] name = "furo" version = "2025.9.25" @@ -677,6 +853,96 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +] + [[package]] name = "ldap3" version = "2.9.1" @@ -877,6 +1143,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" }, + { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" }, + { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, + { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, + { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, + { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, + { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, + { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, + { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" }, +] + [[package]] name = "mdit-py-plugins" version = "0.5.0" @@ -1024,6 +1354,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, ] +[[package]] +name = "opencv-python" +version = "4.11.0.86" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" }, + { url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" }, + { url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -1087,6 +1434,93 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, ] +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.52" @@ -1371,6 +1805,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c3/c0/c33c8792c3e50193ef55adb95c1c3c2786fe281123291c2dbf0eaab95a6f/pyotp-2.9.0-py3-none-any.whl", hash = "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612", size = 13376, upload-time = "2023-07-27T23:41:01.685Z" }, ] +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1591,6 +2034,77 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/d2/1637f4360ada6a368d3265bf39f2cf737a0aaab15ab520fc005903e883f8/ruff-0.14.7-py3-none-win_arm64.whl", hash = "sha256:be4d653d3bea1b19742fcc6502354e32f65cd61ff2fbdb365803ef2c2aec6228", size = 13609215, upload-time = "2025-11-28T20:55:15.375Z" }, ] +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, + { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, + { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, + { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + [[package]] name = "semver" version = "3.0.4" From a38fd7d774a1b196d6832c147caf5b7a32da9a25 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:29:22 -0800 Subject: [PATCH 25/32] Add qc to launcher --- src/aind_behavior_just_frames/launcher.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/aind_behavior_just_frames/launcher.py b/src/aind_behavior_just_frames/launcher.py index b592f54..ef94838 100644 --- a/src/aind_behavior_just_frames/launcher.py +++ b/src/aind_behavior_just_frames/launcher.py @@ -11,6 +11,7 @@ from clabe.pickers import DefaultBehaviorPicker, DefaultBehaviorPickerSettings from pydantic_settings import CliApp +from aind_behavior_just_frames import data_contract from aind_behavior_just_frames.rig import AindJustFramesRig logger = logging.getLogger(__name__) @@ -37,6 +38,24 @@ def experiment(launcher: Launcher) -> None: ) bonsai_app.run() + # Run data qc + if picker.ui_helper.prompt_yes_no_question("Would you like to generate a qc report?"): + try: + import webbrowser + + from contraqctor.qc.reporters import HtmlReporter + + from .data_qc.data_qc import make_qc_runner + + _dataset = data_contract.dataset(launcher.session_directory) + runner = make_qc_runner(_dataset) + qc_path = launcher.session_directory / "Behavior" / "Logs" / "qc_report.html" + reporter = HtmlReporter(output_path=qc_path) + runner.run_all_with_progress(reporter=reporter) + webbrowser.open(qc_path.as_uri(), new=2) + except Exception as e: + logger.error("Failed to run data QC: %s", e) + launcher.copy_logs() robocopy.RobocopyService(source=launcher.session_directory, settings=robocopy.RobocopySettings()).transfer() return From a6459bbf2d22734587151bb8902e14288da2b10a Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 10:44:54 -0800 Subject: [PATCH 26/32] Add temporary launcher dependencies --- pyproject.toml | 2 +- uv.lock | 50 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index be1e78c..c7008d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ dependencies = [ data = ["contraqctor >= 0.5.3 ,<0.6.0"] launcher = [ - "aind-clabe[aind-services] >= 0.9 ,<0.10.0", + "aind-clabe[aind-services] @ git+https://github.com/AllenNeuralDynamics/clabe@test-services-13", "aind_behavior_just_frames[data]",] [dependency-groups] diff --git a/uv.lock b/uv.lock index 9a94719..863e154 100644 --- a/uv.lock +++ b/uv.lock @@ -76,7 +76,7 @@ docs = [ requires-dist = [ { name = "aind-behavior-just-frames", extras = ["data"], marker = "extra == 'launcher'" }, { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9,<0.10.0" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=test-services-13" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, ] @@ -100,7 +100,7 @@ docs = [ [[package]] name = "aind-behavior-services" version = "0.13.0rc0" -source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39#0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" } +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session#0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -111,8 +111,8 @@ dependencies = [ [[package]] name = "aind-clabe" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } +version = "0.9.1rc1" +source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=test-services-13#1e05a67bfa706e948f0fbd960a037b2a1e16d318" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, @@ -123,15 +123,12 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/c1/77cbabec001fa93b558eee34530a0c88eb7f959e10cdfcaacea93496b0e4/aind_clabe-0.9.0.tar.gz", hash = "sha256:732c68e664a84ca933085c44fccb6db782411dacc31d433e2d86c43030b08179", size = 68200, upload-time = "2025-11-18T02:12:32.817Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/cc/975079dd0910d40ada6e4d1f40093ef2d5a18ff8f25df243138ad84076c3/aind_clabe-0.9.0-py3-none-any.whl", hash = "sha256:e09e6f23c421fcd2f68e86639fe1adff84a5cdf46fa9fe6ee36e4840a6c0e036", size = 91335, upload-time = "2025-11-18T02:12:31.731Z" }, -] [package.optional-dependencies] aind-services = [ { name = "aind-data-schema" }, { name = "aind-data-transfer-service" }, + { name = "aind-watchdog-service" }, { name = "cryptography" }, { name = "ldap3", marker = "sys_platform == 'win32'" }, { name = "ms-active-directory" }, @@ -185,6 +182,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/f9/6256bb5b80bc7e51120a038a34a22b8368b6f76f0a340e55408d21c497fb/aind_data_transfer_service-1.22.0-py3-none-any.whl", hash = "sha256:436276434634aecbc4afa0fe25ba4b384151394824e57263d0b9f4f73f8d6a0b", size = 23972, upload-time = "2025-11-24T23:39:05.249Z" }, ] +[[package]] +name = "aind-watchdog-service" +version = "0.1.6.dev8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-data-transfer-service" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/7a/133583e96793c98b46ed06e7e591b7364bdb96a557b5a647dee4294961c3/aind_watchdog_service-0.1.6.dev8.tar.gz", hash = "sha256:5636372fba8504ab3679678319183a39361c655593d3f6d5c919ca41ace7f8ab", size = 392177, upload-time = "2025-11-25T17:20:21.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/cd/3607a1b5bfa8af2cc33f5b44a56c16337a09571d6ee29fbb61fef75d3cd7/aind_watchdog_service-0.1.6.dev8-py3-none-any.whl", hash = "sha256:8f15baf43a2ced64384075d7d3eb88a2a8f96460db020dbd38353a1ee4a2fb4c", size = 48580, upload-time = "2025-11-25T17:20:20.575Z" }, +] + [[package]] name = "alabaster" version = "1.0.0" @@ -2376,14 +2386,18 @@ wheels = [ [[package]] name = "winkerberos" -version = "0.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/75/86d470935167eb1c40d53498993e14cc021d9611a539d61c9b4202c291ab/winkerberos-0.12.2.tar.gz", hash = "sha256:ff91daed04727a0362892802ee093d8da11f08536393526bdf3bc64e04079faa", size = 35672, upload-time = "2025-04-02T14:41:48.274Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/12/23b29d359dee9f7a8243cb0040ea1834acd1af8cbc38cfe1c7ca82ab4ec0/winkerberos-0.12.2-cp311-cp311-win32.whl", hash = "sha256:ff2b2ec9b9246bbc05f0d4e6fe5f3f3563237357b9b35eaa58ec1a9ddf349ab8", size = 25332, upload-time = "2025-04-02T14:41:38.671Z" }, - { url = "https://files.pythonhosted.org/packages/23/d2/2bfa1dcdb4a47b7f989a9e758c892bd7393a156b0e1f0df63eca8304e892/winkerberos-0.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:e6ac2b2cc329a68502821905f6ffe48e109d54a46aba7414ea231a30c75bb2d9", size = 27671, upload-time = "2025-04-02T14:41:40.104Z" }, - { url = "https://files.pythonhosted.org/packages/4f/01/26c5b1435654596c07b314653183ffe42b64ea07041c328f0fd4c68fe9f9/winkerberos-0.12.2-cp312-cp312-win32.whl", hash = "sha256:46dac1300e20738cbaf6c17c2e4832062ed7faee346c7a96f0e57f8bbe279c25", size = 25396, upload-time = "2025-04-02T14:41:41.6Z" }, - { url = "https://files.pythonhosted.org/packages/64/b1/6c4a1e4e50553798eb44dbb0d71ba6af48e2a62a0eb01bd0d4e2b41914e3/winkerberos-0.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:2c5c7a70c0d4a43546b20d5654e7e7e5e5e96f42084a7f293864f7ad0fb1e953", size = 27710, upload-time = "2025-04-02T14:41:42.656Z" }, - { url = "https://files.pythonhosted.org/packages/5f/91/cff6750c7c3b2a9f35e12cd7c4df901251fc3be985edef707a3458c43e9a/winkerberos-0.12.2-cp313-cp313-win32.whl", hash = "sha256:482a72500b7822cc8f941d0c6eed668a24c030ac145c97732e175b51441bebbf", size = 25391, upload-time = "2025-04-02T14:41:43.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/98/defb037ad127c4006c4e992dd55ce0df92059626d3df5f5f4c5fc8502c26/winkerberos-0.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:efd65ba54534512070916cb9c91ef9798a0f9fb0b04e12732c9631e71553fd69", size = 27704, upload-time = "2025-04-02T14:41:45.203Z" }, +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/455f043bc28694a278125d1fc2ab7cbf0ce0953c97bbe1021f08fd19c7b8/winkerberos-0.13.0.tar.gz", hash = "sha256:f3fbb67346fe8ed697e125724b0699d5c2a15b9a5f9151d25a1be88df8dac427", size = 35677, upload-time = "2025-12-03T14:17:29.882Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/09/05c4d2fb93f5478fd1b6146c4fa3fbb80839576a34062e5677f2dec3a430/winkerberos-0.13.0-cp311-cp311-win32.whl", hash = "sha256:a23c83854650416545000c4630e94b16fa14c7b400bd5f08a79718e04eff9135", size = 25642, upload-time = "2025-12-03T14:17:17.42Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5b/bafa1cfb9f047be139ffae330f6eafa0487f8bf82164ead756e0bc2bc047/winkerberos-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:6bc03e66a737bfd11964e6cdc5f03a8cd0baed798f991b1467075c65980c4157", size = 27931, upload-time = "2025-12-03T14:17:18.708Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fa/02de79d7dbec9122a6778678ed432ebffb228c48b16cfba3007c45a6e8fd/winkerberos-0.13.0-cp312-cp312-win32.whl", hash = "sha256:3454b8bb9c11091e4775a8bd692dfbe45f2eab12f3a4837b820c2505088dfdd2", size = 25675, upload-time = "2025-12-03T14:17:20.052Z" }, + { url = "https://files.pythonhosted.org/packages/52/c2/ff9074cf423d82bdfb48ac89e64f360533ba4e2079e8485be8377a8c54fe/winkerberos-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:59f01879c62adcda5af857fd78d2b2dfdfd99cf6179b92d38e2f2bd12db75bf7", size = 27946, upload-time = "2025-12-03T14:17:21.22Z" }, + { url = "https://files.pythonhosted.org/packages/92/83/b1f52594cc2c3ce18c67a04aecb0cb4fb3f4769c268d194cc5f4863150fa/winkerberos-0.13.0-cp313-cp313-win32.whl", hash = "sha256:38fefdfc77a7f82c3cc9f83c7d1b6f242e6d3ea200bfde9b640f7dfe9fdf9bda", size = 25671, upload-time = "2025-12-03T14:17:23.235Z" }, + { url = "https://files.pythonhosted.org/packages/9c/26/b17649b0707e4d8cd9d0d4ceadcef06eff2fc76fcb444cb187763158ae63/winkerberos-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:c45e84a35a3b87b88d0e6d7b55d40712dc021f80af3cb9e81091651e6a73510d", size = 27941, upload-time = "2025-12-03T14:17:24.627Z" }, + { url = "https://files.pythonhosted.org/packages/80/d9/d12d310fdf9ace70f7469ecfd9f112dc39cb7e1f77348228c06a6bd72c57/winkerberos-0.13.0-cp314-cp314-win32.whl", hash = "sha256:46cc29fa95744076a0dd2a167158574826509a5e4aa052b81a2b535aab4af14a", size = 26185, upload-time = "2025-12-03T14:17:25.63Z" }, + { url = "https://files.pythonhosted.org/packages/97/7c/5a418e8d292e3fea1012ccf029b38fae430542fab1beaf6fc60cf138cc08/winkerberos-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:5d5add54d10e31671f7c28c90ccafe98b45cec6d7519949ba30add51e34aee9a", size = 28476, upload-time = "2025-12-03T14:17:26.629Z" }, + { url = "https://files.pythonhosted.org/packages/29/ba/cd8186479046b7a749cee8d4d9fd50e3ce3330d8ea611efe4b8b741f0c3b/winkerberos-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:5bc5e40a816d94d4a5abd665fe62088c1ee91ee9a1f5d787032a63004842fedf", size = 26500, upload-time = "2025-12-03T14:17:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a6/cc5f24b3f1a46a826b7e30ef56fdc1fe22315fef96de8e22afbdd5d98e7a/winkerberos-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:441884c0bda4bee0125fdbd7fee6a232dab58b4a64be8950eb17a8a7404a5440", size = 28715, upload-time = "2025-12-03T14:17:28.813Z" }, ] From 84f52cd245d56c2ddf84845f47c5a68fbbe53129 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 10:53:58 -0800 Subject: [PATCH 27/32] Update schemas --- src/DataSchemas/aind_behavior_just_frames.json | 4 +--- src/Extensions/AindBehaviorJustFrames.Generated.cs | 6 +++--- src/aind_behavior_just_frames/rig.py | 10 ++++++++-- uv.lock | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index e26d504..aeaef5c 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -168,7 +168,6 @@ "items": { "$ref": "#/$defs/SatelliteRig" }, - "minItems": 1, "title": "Satellite Rigs", "type": "array" }, @@ -353,7 +352,7 @@ "type": "string" }, "computer_name": { - "description": "Remote Computer name", + "description": "Computer name", "title": "Computer Name", "type": "string" }, @@ -403,7 +402,6 @@ } }, "required": [ - "computer_name", "rig_name", "data_directory", "zmq_connection" diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index 0213122..a4ece91 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -1083,10 +1083,10 @@ public string Version } /// - /// Remote Computer name + /// Computer name /// - [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Remote Computer name")] + [Newtonsoft.Json.JsonPropertyAttribute("computer_name")] + [System.ComponentModel.DescriptionAttribute("Computer name")] public string ComputerName { get diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 24e91fd..535e619 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -14,7 +14,6 @@ class ZmqPubSub(BaseModel): class SatelliteRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ - computer_name: str = Field(description="Remote Computer name") zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") triggered_camera_controller_0: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( default=None, @@ -48,7 +47,7 @@ class AindJustFramesRig(AindBehaviorRigModel): description="Harp behavior board. Will be the source of triggers for the two camera controllers.", ) satellite_rigs: list[SatelliteRig] = Field( - default_factory=list, min_length=1, description="List of satellite rigs." + default_factory=list, description="List of satellite rigs." ) is_satellite: bool = Field(default=False) zmq_connection: Optional[ZmqPubSub] = Field(default=None, description="ZMQ connection for communication.") @@ -61,3 +60,10 @@ def verify_zmq_nullability(self): if len(self.satellite_rigs) > 0: raise ValueError("Master rigs with satellite rigs must define a ZMQ connection.") return self + + @model_validator(mode="after") + def verify_satellite_rigs(self): + for _r in self.satellite_rigs: + if not _r.is_satellite: + raise ValueError("All rigs in satellite_rigs must have is_satellite=True.") + return self diff --git a/uv.lock b/uv.lock index 863e154..403c6e5 100644 --- a/uv.lock +++ b/uv.lock @@ -112,7 +112,7 @@ dependencies = [ [[package]] name = "aind-clabe" version = "0.9.1rc1" -source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=test-services-13#1e05a67bfa706e948f0fbd960a037b2a1e16d318" } +source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=test-services-13#dfa2668ef278a57bc11f0ac9c643a54c9e9bda27" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, From b403f39b278441bd85d755462f60b266c33ef62a Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:13:50 -0800 Subject: [PATCH 28/32] Regenerate against latest zmq definition --- pyproject.toml | 2 +- .../aind_behavior_just_frames.json | 38 ++++++- .../AindBehaviorJustFrames.Generated.cs | 103 +++++++++++++++++- src/aind_behavior_just_frames/launcher.py | 2 +- src/aind_behavior_just_frames/rig.py | 5 +- uv.lock | 4 +- 6 files changed, 144 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c7008d6..db0bc68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.5.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services @git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39", + "aind_behavior_services @git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@90c77e682922288bc7779c4f8cde5d6f15115899", "pydantic-settings" ] diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index aeaef5c..aacf94d 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -934,8 +934,44 @@ }, "ZmqConnection": { "properties": { + "protocol": { + "const": "Tcp", + "default": "Tcp", + "description": "The protocol to use for the ZMQ connection.", + "title": "Protocol", + "type": "string" + }, + "address": { + "default": "localhost", + "description": "The address of the ZMQ socket.", + "title": "Address", + "type": "string" + }, + "port": { + "default": 5556, + "description": "The port of the ZMQ socket.", + "title": "Port", + "type": "integer" + }, + "action": { + "default": null, + "description": "Whether to bind or connect the socket.", + "oneOf": [ + { + "enum": [ + "bind", + "connect" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action" + }, "connection_string": { - "default": "@tcp://localhost:5556", + "default": "", "description": "The connection string for the ZMQ socket.", "title": "Connection String", "type": "string" diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index a4ece91..4c46b58 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -2300,22 +2300,106 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) public partial class ZmqConnection { + private string _protocol; + + private string _address; + + private int _port; + + private Action? _action; + private string _connectionString; private string _topic; public ZmqConnection() { - _connectionString = "@tcp://localhost:5556"; + _protocol = "Tcp"; + _address = "localhost"; + _port = 5556; + _connectionString = ""; _topic = ""; } protected ZmqConnection(ZmqConnection other) { + _protocol = other._protocol; + _address = other._address; + _port = other._port; + _action = other._action; _connectionString = other._connectionString; _topic = other._topic; } + /// + /// The protocol to use for the ZMQ connection. + /// + [Newtonsoft.Json.JsonPropertyAttribute("protocol")] + [System.ComponentModel.DescriptionAttribute("The protocol to use for the ZMQ connection.")] + public string Protocol + { + get + { + return _protocol; + } + set + { + _protocol = value; + } + } + + /// + /// The address of the ZMQ socket. + /// + [Newtonsoft.Json.JsonPropertyAttribute("address")] + [System.ComponentModel.DescriptionAttribute("The address of the ZMQ socket.")] + public string Address + { + get + { + return _address; + } + set + { + _address = value; + } + } + + /// + /// The port of the ZMQ socket. + /// + [Newtonsoft.Json.JsonPropertyAttribute("port")] + [System.ComponentModel.DescriptionAttribute("The port of the ZMQ socket.")] + public int Port + { + get + { + return _port; + } + set + { + _port = value; + } + } + + /// + /// Whether to bind or connect the socket. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("action")] + [System.ComponentModel.DescriptionAttribute("Whether to bind or connect the socket.")] + public Action? Action + { + get + { + return _action; + } + set + { + _action = value; + } + } + /// /// The connection string for the ZMQ socket. /// @@ -2358,6 +2442,10 @@ public System.IObservable Generate(System.IObservable None: picker = DefaultBehaviorPicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) session = picker.pick_session(AindBehaviorSessionModel) - launcher.register_session(session) rig = picker.pick_rig(AindJustFramesRig) + launcher.register_session(session, rig.data_directory) bonsai_app = AindBehaviorServicesBonsaiApp( workflow=Path(r"./src/main.bonsai"), rig=rig, diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 535e619..0cbb45c 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -11,7 +11,6 @@ class ZmqPubSub(BaseModel): pub: rig.network.ZmqConnection = Field(description="ZMQ Publisher") sub: rig.network.ZmqConnection = Field(description="ZMQ Subscriber") - class SatelliteRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") @@ -46,9 +45,7 @@ class AindJustFramesRig(AindBehaviorRigModel): harp_behavior: rig.harp.HarpBehavior = Field( description="Harp behavior board. Will be the source of triggers for the two camera controllers.", ) - satellite_rigs: list[SatelliteRig] = Field( - default_factory=list, description="List of satellite rigs." - ) + satellite_rigs: list[SatelliteRig] = Field(default_factory=list, description="List of satellite rigs.") is_satellite: bool = Field(default=False) zmq_connection: Optional[ZmqPubSub] = Field(default=None, description="ZMQ connection for communication.") diff --git a/uv.lock b/uv.lock index 403c6e5..4ce5d5d 100644 --- a/uv.lock +++ b/uv.lock @@ -75,7 +75,7 @@ docs = [ [package.metadata] requires-dist = [ { name = "aind-behavior-just-frames", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" }, + { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=90c77e682922288bc7779c4f8cde5d6f15115899" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=test-services-13" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, @@ -100,7 +100,7 @@ docs = [ [[package]] name = "aind-behavior-services" version = "0.13.0rc0" -source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session#0bb8b68c83a4d97b5d972a8595cbef05c7ba4f39" } +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=feat-update-session#90c77e682922288bc7779c4f8cde5d6f15115899" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, From 63efe124a6135ff9769becd247adea0c4b72b2f0 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:17:20 -0800 Subject: [PATCH 29/32] Add draft of zmq architecture --- README.md | 4 ++ assets/zmq_architecture.drawio | 78 ++++++++++++++++++++++++++++++++++ assets/zmq_architecture.svg | 4 ++ 3 files changed, 86 insertions(+) create mode 100644 assets/zmq_architecture.drawio create mode 100644 assets/zmq_architecture.svg diff --git a/README.md b/README.md index c35ca34..047bd7c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # Aind.Behavior.JustFrames A repository with code for a online video acquisition/encoding pipeline + +## ZeroMQ Architecture + +![ZeroMQ Architecture](assets/zmq_architecture.svg) \ No newline at end of file diff --git a/assets/zmq_architecture.drawio b/assets/zmq_architecture.drawio new file mode 100644 index 0000000..69216cb --- /dev/null +++ b/assets/zmq_architecture.drawio @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/zmq_architecture.svg b/assets/zmq_architecture.svg new file mode 100644 index 0000000..561edc1 --- /dev/null +++ b/assets/zmq_architecture.svg @@ -0,0 +1,4 @@ + + + +
@ binds
> connects
@ binds...
Master
Master
Trigger
PubSocker -> @tcp://<*>:trigger_port
Trigger...
Trigger
SubSocket -> >tcp://master_ip:trigger_port
Trigger...
Slave
Slave
Protocol
Req/Resp-> >/@tcp://<slave_ip>:slave_specific_port
Protocol...
Slave
Slave
Protocol
Req/Resp-> >/@tcp://<slave_ip>:slave_specific_port
Protocol...
Protocol
Req/Resp-> >/@tcp://<master_ip>:pc_port
Protocol...
Text is not SVG - cannot display
\ No newline at end of file From db253f745820b6a025cf8e024fd63732c6a50d08 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:48:45 -0800 Subject: [PATCH 30/32] Add zeromq protocol --- .../aind_behavior_just_frames.json | 121 ++- src/Extensions.csproj | 1 + .../AindBehaviorJustFrames.Generated.cs | 454 ++++------- src/Extensions/HarpDevices.bonsai | 324 +------- src/Extensions/Main.bonsai | 436 +---------- .../NetworkConfigToConnectionString.cs | 63 ++ src/Extensions/ZeroMQ.bonsai | 715 ++++++++++++++++++ src/aind_behavior_just_frames/rig.py | 22 +- 8 files changed, 1035 insertions(+), 1101 deletions(-) create mode 100644 src/Extensions/NetworkConfigToConnectionString.cs create mode 100644 src/Extensions/ZeroMQ.bonsai diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index aacf94d..edfc7da 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -176,12 +176,24 @@ "title": "Is Satellite", "type": "boolean" }, - "zmq_connection": { + "zmq_protocol_config": { "default": null, "description": "ZMQ connection for communication.", "oneOf": [ { - "$ref": "#/$defs/ZmqPubSub" + "$ref": "#/$defs/NetworkConfig" + }, + { + "type": "null" + } + ] + }, + "zmq_trigger_config": { + "default": null, + "description": "ZMQ connection for trigger communication.", + "oneOf": [ + { + "$ref": "#/$defs/NetworkConfig" }, { "type": "null" @@ -302,6 +314,29 @@ "title": "HarpBehavior", "type": "object" }, + "NetworkConfig": { + "properties": { + "address": { + "description": "Address for ZMQ connection.", + "format": "ipv4", + "title": "Address", + "type": "string" + }, + "port": { + "description": "Port for ZMQ connection.", + "maximum": 65535, + "minimum": 1, + "title": "Port", + "type": "integer" + } + }, + "required": [ + "address", + "port" + ], + "title": "NetworkConfig", + "type": "object" + }, "Rect": { "description": "Represents a rectangle defined by its top-left corner, width, and height.", "properties": { @@ -367,10 +402,14 @@ "title": "Data Directory", "type": "string" }, - "zmq_connection": { - "$ref": "#/$defs/ZmqPubSub", + "zmq_protocol_config": { + "$ref": "#/$defs/NetworkConfig", "description": "ZMQ connection for communication." }, + "zmq_trigger_config": { + "$ref": "#/$defs/NetworkConfig", + "description": "ZMQ connection for trigger communication." + }, "triggered_camera_controller_0": { "default": null, "description": "Camera controller to triggered cameras. Will use Camera0 register as a trigger.", @@ -404,7 +443,8 @@ "required": [ "rig_name", "data_directory", - "zmq_connection" + "zmq_protocol_config", + "zmq_trigger_config" ], "title": "SatelliteRig", "type": "object" @@ -931,77 +971,6 @@ }, "title": "VideoWriterOpenCv", "type": "object" - }, - "ZmqConnection": { - "properties": { - "protocol": { - "const": "Tcp", - "default": "Tcp", - "description": "The protocol to use for the ZMQ connection.", - "title": "Protocol", - "type": "string" - }, - "address": { - "default": "localhost", - "description": "The address of the ZMQ socket.", - "title": "Address", - "type": "string" - }, - "port": { - "default": 5556, - "description": "The port of the ZMQ socket.", - "title": "Port", - "type": "integer" - }, - "action": { - "default": null, - "description": "Whether to bind or connect the socket.", - "oneOf": [ - { - "enum": [ - "bind", - "connect" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Action" - }, - "connection_string": { - "default": "", - "description": "The connection string for the ZMQ socket.", - "title": "Connection String", - "type": "string" - }, - "topic": { - "default": "", - "title": "Topic", - "type": "string" - } - }, - "title": "ZmqConnection", - "type": "object" - }, - "ZmqPubSub": { - "properties": { - "pub": { - "$ref": "#/$defs/ZmqConnection", - "description": "ZMQ Publisher" - }, - "sub": { - "$ref": "#/$defs/ZmqConnection", - "description": "ZMQ Subscriber" - } - }, - "required": [ - "pub", - "sub" - ], - "title": "ZmqPubSub", - "type": "object" } } } \ No newline at end of file diff --git a/src/Extensions.csproj b/src/Extensions.csproj index 4a83169..47de4a4 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -11,6 +11,7 @@ + \ No newline at end of file diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index 4c46b58..2c3aa93 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -310,7 +310,9 @@ public partial class AindJustFramesRig private bool _isSatellite; - private ZmqPubSub _zmqConnection; + private NetworkConfig _zmqProtocolConfig; + + private NetworkConfig _zmqTriggerConfig; public AindJustFramesRig() { @@ -333,7 +335,8 @@ protected AindJustFramesRig(AindJustFramesRig other) _harpBehavior = other._harpBehavior; _satelliteRigs = other._satelliteRigs; _isSatellite = other._isSatellite; - _zmqConnection = other._zmqConnection; + _zmqProtocolConfig = other._zmqProtocolConfig; + _zmqTriggerConfig = other._zmqTriggerConfig; } [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] @@ -503,17 +506,35 @@ public bool IsSatellite /// ZMQ connection for communication. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection")] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_protocol_config")] [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] - public ZmqPubSub ZmqConnection + public NetworkConfig ZmqProtocolConfig { get { - return _zmqConnection; + return _zmqProtocolConfig; } set { - _zmqConnection = value; + _zmqProtocolConfig = value; + } + } + + /// + /// ZMQ connection for trigger communication. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_trigger_config")] + [System.ComponentModel.DescriptionAttribute("ZMQ connection for trigger communication.")] + public NetworkConfig ZmqTriggerConfig + { + get + { + return _zmqTriggerConfig; + } + set + { + _zmqTriggerConfig = value; } } @@ -539,7 +560,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); stringBuilder.Append("SatelliteRigs = " + _satelliteRigs + ", "); stringBuilder.Append("IsSatellite = " + _isSatellite + ", "); - stringBuilder.Append("ZmqConnection = " + _zmqConnection); + stringBuilder.Append("ZmqProtocolConfig = " + _zmqProtocolConfig + ", "); + stringBuilder.Append("ZmqTriggerConfig = " + _zmqTriggerConfig); return true; } @@ -875,6 +897,92 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class NetworkConfig + { + + private string _address; + + private int _port; + + public NetworkConfig() + { + } + + protected NetworkConfig(NetworkConfig other) + { + _address = other._address; + _port = other._port; + } + + /// + /// Address for ZMQ connection. + /// + [Newtonsoft.Json.JsonPropertyAttribute("address", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Address for ZMQ connection.")] + public string Address + { + get + { + return _address; + } + set + { + _address = value; + } + } + + /// + /// Port for ZMQ connection. + /// + [Newtonsoft.Json.JsonPropertyAttribute("port", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Port for ZMQ connection.")] + public int Port + { + get + { + return _port; + } + set + { + _port = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NetworkConfig(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new NetworkConfig(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Address = " + _address + ", "); + stringBuilder.Append("Port = " + _port); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + /// /// Represents a rectangle defined by its top-left corner, width, and height. /// @@ -1027,7 +1135,9 @@ public partial class SatelliteRig private string _dataDirectory; - private ZmqPubSub _zmqConnection; + private NetworkConfig _zmqProtocolConfig; + + private NetworkConfig _zmqTriggerConfig; private CameraControllerSpinnakerCamera _triggeredCameraController0; @@ -1039,7 +1149,8 @@ public SatelliteRig() { _aindBehaviorServicesPkgVersion = "0.13.0-rc0"; _version = "0.5.0-rc0"; - _zmqConnection = new ZmqPubSub(); + _zmqProtocolConfig = new NetworkConfig(); + _zmqTriggerConfig = new NetworkConfig(); _isSatellite = true; } @@ -1050,7 +1161,8 @@ protected SatelliteRig(SatelliteRig other) _computerName = other._computerName; _rigName = other._rigName; _dataDirectory = other._dataDirectory; - _zmqConnection = other._zmqConnection; + _zmqProtocolConfig = other._zmqProtocolConfig; + _zmqTriggerConfig = other._zmqTriggerConfig; _triggeredCameraController0 = other._triggeredCameraController0; _triggeredCameraController1 = other._triggeredCameraController1; _isSatellite = other._isSatellite; @@ -1137,17 +1249,35 @@ public string DataDirectory /// ZMQ connection for communication. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("zmq_connection", Required=Newtonsoft.Json.Required.Always)] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_protocol_config", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("ZMQ connection for communication.")] - public ZmqPubSub ZmqConnection + public NetworkConfig ZmqProtocolConfig { get { - return _zmqConnection; + return _zmqProtocolConfig; } set { - _zmqConnection = value; + _zmqProtocolConfig = value; + } + } + + /// + /// ZMQ connection for trigger communication. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("zmq_trigger_config", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("ZMQ connection for trigger communication.")] + public NetworkConfig ZmqTriggerConfig + { + get + { + return _zmqTriggerConfig; + } + set + { + _zmqTriggerConfig = value; } } @@ -1217,7 +1347,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("ComputerName = " + _computerName + ", "); stringBuilder.Append("RigName = " + _rigName + ", "); stringBuilder.Append("DataDirectory = " + _dataDirectory + ", "); - stringBuilder.Append("ZmqConnection = " + _zmqConnection + ", "); + stringBuilder.Append("ZmqProtocolConfig = " + _zmqProtocolConfig + ", "); + stringBuilder.Append("ZmqTriggerConfig = " + _zmqTriggerConfig + ", "); stringBuilder.Append("TriggeredCameraController0 = " + _triggeredCameraController0 + ", "); stringBuilder.Append("TriggeredCameraController1 = " + _triggeredCameraController1 + ", "); stringBuilder.Append("IsSatellite = " + _isSatellite); @@ -2294,268 +2425,6 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ZmqConnection - { - - private string _protocol; - - private string _address; - - private int _port; - - private Action? _action; - - private string _connectionString; - - private string _topic; - - public ZmqConnection() - { - _protocol = "Tcp"; - _address = "localhost"; - _port = 5556; - _connectionString = ""; - _topic = ""; - } - - protected ZmqConnection(ZmqConnection other) - { - _protocol = other._protocol; - _address = other._address; - _port = other._port; - _action = other._action; - _connectionString = other._connectionString; - _topic = other._topic; - } - - /// - /// The protocol to use for the ZMQ connection. - /// - [Newtonsoft.Json.JsonPropertyAttribute("protocol")] - [System.ComponentModel.DescriptionAttribute("The protocol to use for the ZMQ connection.")] - public string Protocol - { - get - { - return _protocol; - } - set - { - _protocol = value; - } - } - - /// - /// The address of the ZMQ socket. - /// - [Newtonsoft.Json.JsonPropertyAttribute("address")] - [System.ComponentModel.DescriptionAttribute("The address of the ZMQ socket.")] - public string Address - { - get - { - return _address; - } - set - { - _address = value; - } - } - - /// - /// The port of the ZMQ socket. - /// - [Newtonsoft.Json.JsonPropertyAttribute("port")] - [System.ComponentModel.DescriptionAttribute("The port of the ZMQ socket.")] - public int Port - { - get - { - return _port; - } - set - { - _port = value; - } - } - - /// - /// Whether to bind or connect the socket. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("action")] - [System.ComponentModel.DescriptionAttribute("Whether to bind or connect the socket.")] - public Action? Action - { - get - { - return _action; - } - set - { - _action = value; - } - } - - /// - /// The connection string for the ZMQ socket. - /// - [Newtonsoft.Json.JsonPropertyAttribute("connection_string")] - [System.ComponentModel.DescriptionAttribute("The connection string for the ZMQ socket.")] - public string ConnectionString - { - get - { - return _connectionString; - } - set - { - _connectionString = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("topic")] - public string Topic - { - get - { - return _topic; - } - set - { - _topic = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqConnection(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ZmqConnection(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Protocol = " + _protocol + ", "); - stringBuilder.Append("Address = " + _address + ", "); - stringBuilder.Append("Port = " + _port + ", "); - stringBuilder.Append("Action = " + _action + ", "); - stringBuilder.Append("ConnectionString = " + _connectionString + ", "); - stringBuilder.Append("Topic = " + _topic); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ZmqPubSub - { - - private ZmqConnection _pub; - - private ZmqConnection _sub; - - public ZmqPubSub() - { - _pub = new ZmqConnection(); - _sub = new ZmqConnection(); - } - - protected ZmqPubSub(ZmqPubSub other) - { - _pub = other._pub; - _sub = other._sub; - } - - /// - /// ZMQ Publisher - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("pub", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("ZMQ Publisher")] - public ZmqConnection Pub - { - get - { - return _pub; - } - set - { - _pub = value; - } - } - - /// - /// ZMQ Subscriber - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("sub", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("ZMQ Subscriber")] - public ZmqConnection Sub - { - get - { - return _sub; - } - set - { - _sub = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ZmqPubSub(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ZmqPubSub(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Pub = " + _pub + ", "); - stringBuilder.Append("Sub = " + _sub); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum SpinnakerCameraColorProcessing @@ -2569,19 +2438,6 @@ public enum SpinnakerCameraColorProcessing } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum Action - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="bind")] - Bind = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="connect")] - Connect = 1, - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] internal class JsonInheritanceAttribute : System.Attribute @@ -2803,6 +2659,11 @@ public System.IObservable Process(System.IObservable sourc return Process(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -2832,16 +2693,6 @@ public System.IObservable Process(System.IObservable { return Process(source); } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } } @@ -2857,14 +2708,13 @@ public System.IObservable Process(System.IObservable source) [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { diff --git a/src/Extensions/HarpDevices.bonsai b/src/Extensions/HarpDevices.bonsai index bd63533..36929c6 100644 --- a/src/Extensions/HarpDevices.bonsai +++ b/src/Extensions/HarpDevices.bonsai @@ -5,9 +5,8 @@ xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:p1="clr-namespace:AindJustFramesSchemas;assembly=Extensions" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" + xmlns:p2="clr-namespace:;assembly=Extensions" xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" - xmlns:p2="clr-namespace:AindJustFramesSchemas.MessageProtocol;assembly=Extensions" - xmlns:p3="clr-namespace:;assembly=Extensions" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -95,19 +94,17 @@ MessageBytes - - HarpZmqTopic - - - - - - RigSchema - ZmqConnection.Pub.ConnectionString + ZmqTriggerConfig + + + + tcp + Bind + @@ -116,7 +113,7 @@ - tcp://localhost:5557 + @tcp://localhost:5557 @@ -131,12 +128,11 @@ - + - + - - +
@@ -187,24 +183,22 @@ RigSchema
- ZmqConnection.Sub.ConnectionString + ZmqTriggerConfig - - - - - - - HarpZmqTopic + + + tcp + Connect + - + - tcp://localhost:5557 + >tcp://localhost:5557 @@ -221,12 +215,11 @@ - + - + - @@ -318,271 +311,6 @@ - - RigSchema - - - NotSatellite - - - - Source1 - - - IsSatellite - - - - - - - - - - - - - - None - - - - MainZmqLogic - - - - Source1 - - - - 1 - - - - - - - RigSchema - - - RigSchema - - - SatelliteRigs - - - - - - - - - Source1 - - - satelliteRig - - - EnableExperiment - - - - - - satelliteRig - - - RigName - - - - - - - - - Request - - - - satelliteRig - - - ZmqConnection.Pub - - - ConnectionString - - - - - - - - MessageProtocolZmqTopic - - - - - - - - - tcp://localhost:5557 - - - - Last - - - - - - Payload - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RigSchema - - - - - - Source1 - - - IsSatellite - - - - - - - - - - - - None - - - - SatelliteZmqLogic - - - - Source1 - - - - 1 - - - - - - - RigSchema - - - InboundMessages - - - Payload - - - - - - - 1 - - - - - EnableExperiment - - - InboundMessages - - - Payload - - - - - - - 1 - - - - - EndExperiment - - - - - - - - - - - - - - - - - - - - - - @@ -599,14 +327,6 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Extensions/Main.bonsai b/src/Extensions/Main.bonsai index 4955b63..39bab7a 100644 --- a/src/Extensions/Main.bonsai +++ b/src/Extensions/Main.bonsai @@ -8,12 +8,9 @@ xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p4="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:p5="clr-namespace:AindJustFramesSchemas.MessageProtocol;assembly=Extensions" - xmlns:p6="clr-namespace:;assembly=Extensions" - xmlns:zmq="clr-namespace:Bonsai.ZeroMQ;assembly=Bonsai.ZeroMQ" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:p7="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - xmlns:p8="clr-namespace:AindJustFramesSchemas;assembly=Extensions" + xmlns:p5="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" + xmlns:p6="clr-namespace:AindJustFramesSchemas;assembly=Extensions" xmlns:ui="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -98,32 +95,6 @@ CompoundRootPath - - - message_protocol - - - - - 1 - - - - MessageProtocolZmqTopic - - - - harp - - - - - 1 - - - - HarpZmqTopic - false @@ -267,19 +238,15 @@ - - + - - + + + - - - - - + @@ -288,6 +255,7 @@ + HarpBehaviorEvents @@ -340,375 +308,19 @@ - - OutboundMessages - - - NetworkCommunication - - - - RigSchema - - - ZmqConnection - - - ZmqConnection - - - - PT0S - PT1S - - - - - - - RigSchema - - - RigName - - - - - - - - - Event - - - - OutboundMessages - - - Source1 - - - - None - - - - ZmqConnection - - - - - - - - MessageProtocolZmqTopic - - - - - - - - - tcp://localhost:5557 - message_protocol - - - - InboundMessages - - - IsRequest - - - - Source1 - - - MessageType - - - - Request - - - - - - - - - - - - - Payload - - - - - - - EnableExperiment - - - Response - - - - IsExperimentRunning - - - - - - Source1 - - - - - - - - - - - 1 - - - - - - - RigSchema - - - RigName - - - - - - - - - Reply - - - - - - - - - - - - - - - - - - OutboundMessages - - - - 1 - - - - InboundMessages - - - IsRequest - - - - Source1 - - - MessageType - - - - Request - - - - - - - - - - - - - Payload - - - - - - - EndExperiment - - - Response - - - - IsExperimentRunning - - - - - - - Source1 - - - - - - - - - - - - - RigSchema - - - RigName - - - - - - - - - Reply - - - - - - - - - - - - - - - - - - OutboundMessages - - - - 1 - - - - ZmqConnection - - - - - - - - MessageProtocolZmqTopic - - - - - - - - - tcp://localhost:5557 - message_protocol - - - - Last - - - - - - InboundMessages - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - InboundMessages - - - - - - - + + + + + - - - - - + + + +
@@ -826,9 +438,9 @@
- - - + + + @@ -974,8 +586,8 @@ SubjectSchema - - None + + None @@ -1004,8 +616,8 @@ RigSchema - - None + + None diff --git a/src/Extensions/NetworkConfigToConnectionString.cs b/src/Extensions/NetworkConfigToConnectionString.cs new file mode 100644 index 0000000..8af6f2b --- /dev/null +++ b/src/Extensions/NetworkConfigToConnectionString.cs @@ -0,0 +1,63 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using AindJustFramesSchemas; +using System.Collections.Generic; + +[Combinator] +[Description("Returns a formatted ZeroMQ connection string based on the provided NetworkConfig object.")] +[WorkflowElementCategory(ElementCategory.Transform)] +public class NetworkConfigToConnectionString +{ + private string protocol = "tcp"; + public string Protocol + { + get { return protocol; } + set { protocol = value; } + } + + private ActionType action = ActionType.Connect; + public ActionType Action + { + get { return action; } + set { action = value; } + } + + + public IObservable Process(IObservable source) + { + return source.Select(value => + { + string address = value.Address; + System.Net.IPAddress ip; + if (!(System.Net.IPAddress.TryParse(address, out ip) && ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + && !string.Equals(address, "localhost", StringComparison.OrdinalIgnoreCase)) + { + throw new FormatException(string.Format("Invalid address format: {0}. Must be IPv4 or 'localhost'.", address)); + } + + return string.Format("{0}{1}://{2}:{3}", + actionPrefixCharacter[Action], + Protocol, + address, + value.Port); + }); + } + + + public enum ActionType + { + Connect, + Bind, + None + } + + private readonly Dictionary actionPrefixCharacter = new Dictionary + { + { ActionType.Connect, ">" }, + { ActionType.Bind, "@" }, + { ActionType.None, "" } + }; +} diff --git a/src/Extensions/ZeroMQ.bonsai b/src/Extensions/ZeroMQ.bonsai new file mode 100644 index 0000000..f3a1ea1 --- /dev/null +++ b/src/Extensions/ZeroMQ.bonsai @@ -0,0 +1,715 @@ + + + + + + RigSchema + + + NotSatellite + + + + Source1 + + + IsSatellite + + + + + + + + + + + + + + None + + + + MainZmqLogic + + + + Source1 + + + + 1 + + + + + + + RigSchema + + + RigSchema + + + SatelliteRigs + + + + + + CreateRequestToSatalite + + + + Source1 + + + satelliteRig + + + EnableExperiment + + + + + + satelliteRig + + + RigName + + + + + + + + + Request + + + + + None + + + + satelliteRig + + + ZmqProtocolConfig + + + + tcp + Connect + + + + + + + + + + >tcp://localhost:5557 + + + + Last + + + + + + Payload + + + + + + + + + + + + + + + + + + + + + + + + + + + + RigSchema + + + ZmqProtocolConfig + + + + tcp + Bind + + + + + + + + + + @tcp://*:5557 + + + + + + + Source1 + + + + 1 + + + + Last + + + + + + Request + + + Request + + + Payload + + + + + + + 1 + + + + + EnableExperiment + + + MakeResponse + + + + IsExperimentRunning + + + + + + Source1 + + + + + + + + + + + 1 + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + + + + Request + + + Payload + + + + + + + 1 + + + + + EndExperiment + + + MakeResponse + + + + IsExperimentRunning + + + + + + + Source1 + + + + + + + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + + + + Out + + + + 1 + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RigSchema + + + + + + Source1 + + + IsSatellite + + + + + + + + + + + + None + + + + SatelliteZmqLogic + + + + Source1 + + + + 1 + + + + + + + SatelliteRigSchema + + + SatelliteRigSchema + + + ZmqProtocolConfig + + + + tcp + Bind + + + + + + + + + + @tcp://localhost:5557 + + + + + + + Source1 + + + + 1 + + + + Last + + + + + + Request + + + Request + + + Payload + + + + + + + 1 + + + + + EnableExperiment + + + MakeResponse + + + + IsExperimentRunning + + + + + + Source1 + + + + + + + + + + + 1 + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + + + + Request + + + Payload + + + + + + + 1 + + + + + EndExperiment + + + MakeResponse + + + + IsExperimentRunning + + + + + + + Source1 + + + + + + + + + + + + + RigSchema + + + RigName + + + + + + + + + Reply + + + + + + + + + + + + + + + + + + Out + + + + 1 + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 0cbb45c..877722d 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -3,17 +3,18 @@ import aind_behavior_services.rig as rig from aind_behavior_services.rig import AindBehaviorRigModel from pydantic import BaseModel, Field, field_validator, model_validator +from ipaddress import IPv4Address from . import __semver__ - -class ZmqPubSub(BaseModel): - pub: rig.network.ZmqConnection = Field(description="ZMQ Publisher") - sub: rig.network.ZmqConnection = Field(description="ZMQ Subscriber") +class NetworkConfig(BaseModel): + address: IPv4Address = Field(description="Address for ZMQ connection.") + port: int = Field(description="Port for ZMQ connection.", ge=1, le=65535) class SatelliteRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ - zmq_connection: ZmqPubSub = Field(description="ZMQ connection for communication.") + zmq_protocol_config: NetworkConfig = Field(description="ZMQ connection for communication.") + zmq_trigger_config: NetworkConfig = Field(description="ZMQ connection for trigger communication.") triggered_camera_controller_0: Optional[rig.cameras.CameraController[rig.cameras.SpinnakerCamera]] = Field( default=None, description="Camera controller to triggered cameras. Will use Camera0 register as a trigger.", @@ -24,9 +25,9 @@ class SatelliteRig(AindBehaviorRigModel): ) is_satellite: bool = Field(default=True) - @field_validator("zmq_connection", mode="after") + @field_validator("zmq_protocol_config", mode="after") @classmethod - def validate_zmq_connection(cls, value: rig.network.ZmqConnection): + def validate_zmq_protocol_config(cls, value: rig.network.ZmqConnection): if isinstance(value, rig.network.ZmqConnection): value.topic = "" return value @@ -47,11 +48,14 @@ class AindJustFramesRig(AindBehaviorRigModel): ) satellite_rigs: list[SatelliteRig] = Field(default_factory=list, description="List of satellite rigs.") is_satellite: bool = Field(default=False) - zmq_connection: Optional[ZmqPubSub] = Field(default=None, description="ZMQ connection for communication.") + zmq_protocol_config: Optional[NetworkConfig] = Field(default=None, description="ZMQ connection for communication.") + zmq_trigger_config: Optional[NetworkConfig] = Field( + default=None, description="ZMQ connection for trigger communication." + ) @model_validator(mode="after") def verify_zmq_nullability(self): - if self.zmq_connection is None: + if self.zmq_protocol_config is None: if self.is_satellite: raise ValueError("Satellite rigs must define a ZMQ connection.") if len(self.satellite_rigs) > 0: From 61ddd3ba0f04b9953c5933d721fdedf798bc0028 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:56:15 -0800 Subject: [PATCH 31/32] Cleanup models --- .../aind_behavior_just_frames.json | 17 +++---- .../AindBehaviorJustFrames.Generated.cs | 1 + src/Extensions/HarpDevices.bonsai | 50 ++++++++++++------- src/aind_behavior_just_frames/rig.py | 20 +++++--- 4 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/DataSchemas/aind_behavior_just_frames.json b/src/DataSchemas/aind_behavior_just_frames.json index edfc7da..cbddcc1 100644 --- a/src/DataSchemas/aind_behavior_just_frames.json +++ b/src/DataSchemas/aind_behavior_just_frames.json @@ -177,16 +177,12 @@ "type": "boolean" }, "zmq_protocol_config": { - "default": null, - "description": "ZMQ connection for communication.", - "oneOf": [ - { - "$ref": "#/$defs/NetworkConfig" - }, - { - "type": "null" - } - ] + "$ref": "#/$defs/NetworkConfig", + "default": { + "address": "localhost", + "port": 5555 + }, + "description": "ZMQ connection for communication." }, "zmq_trigger_config": { "default": null, @@ -318,7 +314,6 @@ "properties": { "address": { "description": "Address for ZMQ connection.", - "format": "ipv4", "title": "Address", "type": "string" }, diff --git a/src/Extensions/AindBehaviorJustFrames.Generated.cs b/src/Extensions/AindBehaviorJustFrames.Generated.cs index 2c3aa93..cc90a7e 100644 --- a/src/Extensions/AindBehaviorJustFrames.Generated.cs +++ b/src/Extensions/AindBehaviorJustFrames.Generated.cs @@ -321,6 +321,7 @@ public AindJustFramesRig() _harpBehavior = new HarpBehavior(); _satelliteRigs = new System.Collections.Generic.List(); _isSatellite = false; + _zmqProtocolConfig = new NetworkConfig(); } protected AindJustFramesRig(AindJustFramesRig other) diff --git a/src/Extensions/HarpDevices.bonsai b/src/Extensions/HarpDevices.bonsai index 36929c6..a8664a3 100644 --- a/src/Extensions/HarpDevices.bonsai +++ b/src/Extensions/HarpDevices.bonsai @@ -45,20 +45,6 @@ BehaviorBoard - - Source1 - - - - 1 - - - - - - - RigSchema - HarpBehaviorCommands @@ -88,6 +74,20 @@ internalPub + + Source1 + + + + 1 + + + + + + + RigSchema + internalPub @@ -116,15 +116,25 @@ @tcp://localhost:5557 + + RigSchema + + + ZmqTriggerConfig + + + + + - + - + + - - + @@ -133,6 +143,10 @@ + + + + diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 877722d..0a28b5e 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -3,12 +3,11 @@ import aind_behavior_services.rig as rig from aind_behavior_services.rig import AindBehaviorRigModel from pydantic import BaseModel, Field, field_validator, model_validator -from ipaddress import IPv4Address from . import __semver__ class NetworkConfig(BaseModel): - address: IPv4Address = Field(description="Address for ZMQ connection.") + address: str = Field(description="Address for ZMQ connection.") port: int = Field(description="Port for ZMQ connection.", ge=1, le=65535) class SatelliteRig(AindBehaviorRigModel): @@ -48,23 +47,28 @@ class AindJustFramesRig(AindBehaviorRigModel): ) satellite_rigs: list[SatelliteRig] = Field(default_factory=list, description="List of satellite rigs.") is_satellite: bool = Field(default=False) - zmq_protocol_config: Optional[NetworkConfig] = Field(default=None, description="ZMQ connection for communication.") + zmq_protocol_config: NetworkConfig = Field(default=NetworkConfig(address="localhost", port=5555), description="ZMQ connection for communication.", validate_default=True) zmq_trigger_config: Optional[NetworkConfig] = Field( default=None, description="ZMQ connection for trigger communication." ) @model_validator(mode="after") def verify_zmq_nullability(self): - if self.zmq_protocol_config is None: - if self.is_satellite: - raise ValueError("Satellite rigs must define a ZMQ connection.") - if len(self.satellite_rigs) > 0: - raise ValueError("Master rigs with satellite rigs must define a ZMQ connection.") + if len(self.satellite_rigs) > 0: + if self.zmq_trigger_config is None: + raise ValueError("zmq_trigger_config cannot be None when satellite_rigs are defined.") + for _r in self.satellite_rigs: + _r.zmq_trigger_config = self.zmq_trigger_config return self @model_validator(mode="after") def verify_satellite_rigs(self): + seen = set() for _r in self.satellite_rigs: if not _r.is_satellite: raise ValueError("All rigs in satellite_rigs must have is_satellite=True.") + addr_port = (_r.zmq_protocol_config.address, _r.zmq_protocol_config.port) + if addr_port in seen: + raise ValueError(f"Duplicate address:port found in satellite_rigs: {addr_port}") + seen.add(addr_port) return self From 05693e102f0db062fe991f55c141811e7f06287b Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:57:18 -0800 Subject: [PATCH 32/32] Linting --- src/aind_behavior_just_frames/rig.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/aind_behavior_just_frames/rig.py b/src/aind_behavior_just_frames/rig.py index 0a28b5e..1dea51b 100644 --- a/src/aind_behavior_just_frames/rig.py +++ b/src/aind_behavior_just_frames/rig.py @@ -6,10 +6,12 @@ from . import __semver__ + class NetworkConfig(BaseModel): address: str = Field(description="Address for ZMQ connection.") port: int = Field(description="Port for ZMQ connection.", ge=1, le=65535) + class SatelliteRig(AindBehaviorRigModel): version: Literal[__semver__] = __semver__ zmq_protocol_config: NetworkConfig = Field(description="ZMQ connection for communication.") @@ -47,7 +49,11 @@ class AindJustFramesRig(AindBehaviorRigModel): ) satellite_rigs: list[SatelliteRig] = Field(default_factory=list, description="List of satellite rigs.") is_satellite: bool = Field(default=False) - zmq_protocol_config: NetworkConfig = Field(default=NetworkConfig(address="localhost", port=5555), description="ZMQ connection for communication.", validate_default=True) + zmq_protocol_config: NetworkConfig = Field( + default=NetworkConfig(address="localhost", port=5555), + description="ZMQ connection for communication.", + validate_default=True, + ) zmq_trigger_config: Optional[NetworkConfig] = Field( default=None, description="ZMQ connection for trigger communication." )