From 6859c71e8441939ffca703aa4fce6660bc315189 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 17 Jun 2024 13:50:16 -0700 Subject: [PATCH 01/16] add s3 destination to harmony job --- bignbit/submit_harmony_job.py | 14 +++++++-- terraform/state_machine_definition.tpl | 42 ++------------------------ 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/bignbit/submit_harmony_job.py b/bignbit/submit_harmony_job.py index 71aca89..f78cb56 100644 --- a/bignbit/submit_harmony_job.py +++ b/bignbit/submit_harmony_job.py @@ -46,8 +46,15 @@ def create_harmony_job(config): variable = current_item.get('id') big_config = config.get('big_config') + files = granule.get('files') + bucket_name = None + for file in files: + if file.get('type') == 'data': + file_path = os.path.dirname(file.get('key')) + destination_bucket_url = f's3://{file.get('bucket')}/{file_path}' + harmony_client = utils.get_harmony_client(cmr_env) - harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config) + harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, destination_bucket_url) job = harmony_client.submit(harmony_request) harmony_job = { @@ -60,7 +67,7 @@ def create_harmony_job(config): return harmony_job -def generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config): +def generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, destination_bucket_url): """Generate the harmony request to be made and return request object""" request = Request( @@ -70,7 +77,8 @@ def generate_harmony_request(collection_concept_id, granule_concept_id, variable spatial=BBox(-180, -90, 180, 90), width=big_config['config']['width'], height=big_config['config']['height'], - format="image/png" + format="image/png", + destination_url=destination_bucket_url ) return request diff --git a/terraform/state_machine_definition.tpl b/terraform/state_machine_definition.tpl index 4c82902..6d1b7bd 100644 --- a/terraform/state_machine_definition.tpl +++ b/terraform/state_machine_definition.tpl @@ -320,7 +320,7 @@ { "Variable":"$.payload.harmony_job_status", "StringMatches":"successful", - "Next":"Copy Harmony Output to S3", + "Next":"JobSuccessful", "Comment":"Job successful" }, { @@ -344,44 +344,8 @@ ], "Default":"Wait 20 Seconds" }, - "Copy Harmony Output to S3":{ - "Type":"Task", - "Resource":"${CopyHarmonyOutputToS3Lambda}", - "Parameters":{ - "cma":{ - "event.$":"$", - "task_config":{ - "cmr_environment":"{$.meta.cmr.cmrEnvironment}", - "harmony_job":"{$.payload.harmony_job.job}", - "current_item":"{$.current_item}", - "cumulus_message":{ - "input":"{$.payload}" - } - } - } - }, - "Retry":[ - { - "ErrorEquals":[ - "Lambda.ServiceException", - "Lambda.AWSLambdaException", - "Lambda.SdkClientException", - "Lambda.TooManyRequestsException" - ], - "IntervalSeconds":2, - "MaxAttempts":6, - "BackoffRate":2 - }, - { - "ErrorEquals": [ - "Lambda.Unknown" - ], - "BackoffRate": 2, - "IntervalSeconds": 2, - "MaxAttempts": 2 - } - ], - "End":true + "JobSuccessful":{ + "Type":"Succeed" }, "Fail":{ "Type":"Fail" From 4bebf33a8fa935642cad099a86f6e63db6f2cd51 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 17 Jun 2024 14:13:37 -0700 Subject: [PATCH 02/16] syntax --- bignbit/submit_harmony_job.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bignbit/submit_harmony_job.py b/bignbit/submit_harmony_job.py index f78cb56..087a7f3 100644 --- a/bignbit/submit_harmony_job.py +++ b/bignbit/submit_harmony_job.py @@ -47,11 +47,12 @@ def create_harmony_job(config): big_config = config.get('big_config') files = granule.get('files') - bucket_name = None + destination_bucket_url = None for file in files: if file.get('type') == 'data': file_path = os.path.dirname(file.get('key')) - destination_bucket_url = f's3://{file.get('bucket')}/{file_path}' + bucket_name = file.get('bucket') + destination_bucket_url = f's3://{bucket_name}/{file_path}' harmony_client = utils.get_harmony_client(cmr_env) harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, destination_bucket_url) From 34b2871e5e10808e6169b2d23f8ee2cfde2c5bf9 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 19 Jun 2024 19:41:35 -0700 Subject: [PATCH 03/16] job success --- examples/cumulus-tf/browse_image_workflow.tf | 1 + examples/cumulus-tf/variable.tf | 12 ++++++++++-- terraform/state_machine_definition.tpl | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/examples/cumulus-tf/browse_image_workflow.tf b/examples/cumulus-tf/browse_image_workflow.tf index 004f98a..94faf20 100644 --- a/examples/cumulus-tf/browse_image_workflow.tf +++ b/examples/cumulus-tf/browse_image_workflow.tf @@ -20,4 +20,5 @@ resource "aws_sfn_state_machine" "sfn_state_machine" { role_arn = aws_iam_role.step.arn definition = module.bignbit_module.workflow_definition + #tags = var.tags } diff --git a/examples/cumulus-tf/variable.tf b/examples/cumulus-tf/variable.tf index a63721d..70f05b3 100644 --- a/examples/cumulus-tf/variable.tf +++ b/examples/cumulus-tf/variable.tf @@ -23,9 +23,17 @@ variable "app_name" { variable "default_tags" { type = map(string) - default = {} + #default = { + # bignbit-version = "2.0.1" + #} } - +#variable "tags" { +# type = map(string) +# default = { +# Name = "StateMachine" +# Environment = "SIT" +# } +#} variable "stage" {} variable "app_version" {} diff --git a/terraform/state_machine_definition.tpl b/terraform/state_machine_definition.tpl index 6d1b7bd..8078d24 100644 --- a/terraform/state_machine_definition.tpl +++ b/terraform/state_machine_definition.tpl @@ -320,7 +320,7 @@ { "Variable":"$.payload.harmony_job_status", "StringMatches":"successful", - "Next":"JobSuccessful", + "Next":"Job Successful", "Comment":"Job successful" }, { @@ -344,7 +344,7 @@ ], "Default":"Wait 20 Seconds" }, - "JobSuccessful":{ + "Job Successful":{ "Type":"Succeed" }, "Fail":{ From 177215332e4b27b7028b9ba276c9639bc1491a5e Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 20 Jun 2024 17:18:39 -0700 Subject: [PATCH 04/16] harmony block update --- terraform/state_machine_definition.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/state_machine_definition.tpl b/terraform/state_machine_definition.tpl index 8078d24..42a3d25 100644 --- a/terraform/state_machine_definition.tpl +++ b/terraform/state_machine_definition.tpl @@ -542,4 +542,4 @@ "Cause": "Workflow failed" } } -} +} \ No newline at end of file From ea3dba53836d16df347eb4576496512dec4f4a46 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 20 Jun 2024 17:54:28 -0700 Subject: [PATCH 05/16] --variable --- examples/cumulus-tf/variable.tf | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/examples/cumulus-tf/variable.tf b/examples/cumulus-tf/variable.tf index 70f05b3..a63721d 100644 --- a/examples/cumulus-tf/variable.tf +++ b/examples/cumulus-tf/variable.tf @@ -23,17 +23,9 @@ variable "app_name" { variable "default_tags" { type = map(string) - #default = { - # bignbit-version = "2.0.1" - #} + default = {} } -#variable "tags" { -# type = map(string) -# default = { -# Name = "StateMachine" -# Environment = "SIT" -# } -#} + variable "stage" {} variable "app_version" {} From 85b73e7a22fdb6e03477a3c8a6f7661030f10bad Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 27 Jun 2024 14:01:45 -0700 Subject: [PATCH 06/16] temp test in uat --- .github/workflows/cicd-pipeline.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cicd-pipeline.yml b/.github/workflows/cicd-pipeline.yml index 81cf2cf..82875a3 100644 --- a/.github/workflows/cicd-pipeline.yml +++ b/.github/workflows/cicd-pipeline.yml @@ -283,6 +283,7 @@ jobs: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release') || + startsWith(github.ref, 'refs/heads/feature') || github.event_name == 'workflow_dispatch' steps: - uses: actions/checkout@v4 From dc8b8ccb609dc1dd0ec68667f7e1d6edd1d527e0 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 27 Jun 2024 17:19:33 -0700 Subject: [PATCH 07/16] manual to uat --- .github/workflows/cicd-pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cicd-pipeline.yml b/.github/workflows/cicd-pipeline.yml index 82875a3..441d9d5 100644 --- a/.github/workflows/cicd-pipeline.yml +++ b/.github/workflows/cicd-pipeline.yml @@ -315,4 +315,4 @@ jobs: env: AWS_DEFAULT_REGION: us-west-2 run: | - ./bin/deploy.sh --app-version ${{ env.THE_VERSION }} --tf-venue ${{ vars.TF_VENUE }} --lambda_container_image_uri ${{ env.CONTAINER_IMAGE_URI }} + ./bin/deploy.sh --app-version ${{ env.THE_VERSION }} --tf-venue uat --lambda_container_image_uri ${{ env.CONTAINER_IMAGE_URI }} From a9fcd4b2808894e860ae04f7ae8ab6a29d18ff5f Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 16 Aug 2024 16:57:35 -0700 Subject: [PATCH 08/16] test s1-v1 --- bignbit/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bignbit/utils.py b/bignbit/utils.py index 55a1156..9a2b960 100644 --- a/bignbit/utils.py +++ b/bignbit/utils.py @@ -261,7 +261,8 @@ def get_harmony_client(environment_str: str) -> harmony.Client: harmony_environ = Environment.UAT if environment_str.upper() in ("SIT", "SANDBOX", "SBX"): - harmony_environ = Environment.SIT + #harmony_environ = Environment.SIT + harmony_environ = Environment.UAT elif environment_str.upper() == "UAT": harmony_environ = Environment.UAT elif environment_str.upper() in ("OPS", "PROD"): From bc69cfa2319c8aa495fa6490d2157cc9f9f2106d Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 16 Aug 2024 17:05:00 -0700 Subject: [PATCH 09/16] lint --- bignbit/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bignbit/utils.py b/bignbit/utils.py index 9a2b960..3142b09 100644 --- a/bignbit/utils.py +++ b/bignbit/utils.py @@ -261,7 +261,6 @@ def get_harmony_client(environment_str: str) -> harmony.Client: harmony_environ = Environment.UAT if environment_str.upper() in ("SIT", "SANDBOX", "SBX"): - #harmony_environ = Environment.SIT harmony_environ = Environment.UAT elif environment_str.upper() == "UAT": harmony_environ = Environment.UAT From a52944f71d7957ae84f36c4dac256f71bacc6cdd Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 16 Aug 2024 17:11:58 -0700 Subject: [PATCH 10/16] deploy --sit --- .github/workflows/cicd-pipeline.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/cicd-pipeline.yml b/.github/workflows/cicd-pipeline.yml index 441d9d5..81cf2cf 100644 --- a/.github/workflows/cicd-pipeline.yml +++ b/.github/workflows/cicd-pipeline.yml @@ -283,7 +283,6 @@ jobs: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release') || - startsWith(github.ref, 'refs/heads/feature') || github.event_name == 'workflow_dispatch' steps: - uses: actions/checkout@v4 @@ -315,4 +314,4 @@ jobs: env: AWS_DEFAULT_REGION: us-west-2 run: | - ./bin/deploy.sh --app-version ${{ env.THE_VERSION }} --tf-venue uat --lambda_container_image_uri ${{ env.CONTAINER_IMAGE_URI }} + ./bin/deploy.sh --app-version ${{ env.THE_VERSION }} --tf-venue ${{ vars.TF_VENUE }} --lambda_container_image_uri ${{ env.CONTAINER_IMAGE_URI }} From c18a74965fb790ffb749c4343abeb54b81547d4c Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:03:17 -0800 Subject: [PATCH 11/16] Update to place harmony results in our bucket --- .gitignore | 8 +- README.md | 179 +- bignbit/copy_harmony_output_to_s3.py | 133 - bignbit/generate_image_metadata.py | 2 +- bignbit/image_set.py | 4 +- bignbit/process_harmony_results.py | 113 + bignbit/submit_harmony_job.py | 46 +- docker/Dockerfile | 4 +- examples/cumulus-tf/.terraform.lock.hcl | 83 +- examples/cumulus-tf/bignbit.tf | 24 - examples/cumulus-tf/browse_image_workflow.tf | 35 +- examples/cumulus-tf/fake_gitc.tf | 2 +- examples/cumulus-tf/iam.tf | 2 - examples/cumulus-tf/iam_step.tf | 1 - examples/cumulus-tf/main.tf | 29 +- examples/cumulus-tf/tfvars/sit.tfvars | 4 +- examples/cumulus-tf/tfvars/uat.tfvars | 4 +- examples/cumulus-tf/variable.tf | 89 +- poetry.lock | 2142 ++++++++++------- terraform/lambda_functions.tf | 316 ++- terraform/main.tf | 80 +- terraform/outputs.tf | 33 +- terraform/s3.tf | 123 + terraform/sqs_sns.tf | 142 ++ terraform/state_machine_definition.tpl | 50 +- terraform/variables.tf | 53 +- ...4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json | 29 +- ...2T034350Z_20230131T222341Z_L8_30_v0.0.json | 298 +-- ...T121219Z_20241206T065726Z_S1A_30_v1.0.json | 206 ++ 29 files changed, 2498 insertions(+), 1736 deletions(-) delete mode 100644 bignbit/copy_harmony_output_to_s3.py create mode 100644 bignbit/process_harmony_results.py delete mode 100644 examples/cumulus-tf/bignbit.tf create mode 100644 terraform/s3.tf create mode 100644 terraform/sqs_sns.tf create mode 100644 tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.json diff --git a/.gitignore b/.gitignore index b5f8a4f..0159890 100644 --- a/.gitignore +++ b/.gitignore @@ -137,11 +137,11 @@ dmypy.json # Generated samples tests/2021* /terraform/big-lambda.zip -/terraform_deploy/tfplan +/examples/cumulus-tf/tfplan .terraform.d .terraform /.bash_history -/terraform_deploy/cumulus-message-adapter.zip -/terraform_deploy/.terraform.lock.hcl +/examples/cumulus-tf/cumulus-message-adapter.zip bignbit-lambda.zip -terraform_deploy/bignbit_module/ +/examples/cumulus-tf/bignbit_module/ +!/examples/cumulus-tf/.terraform.lock.hcl diff --git a/README.md b/README.md index 52a798e..7d1f1e8 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,188 @@ + +* [About](#about) +* [Installing this module](#installing-this-module) +* [Configuring a collection](#configuring-a-collection) + * [Harmony requests](#harmony-requests) +* [Module Inputs](#module-inputs) +* [Module Outputs](#module-outputs) +* [Assumptions](#assumptions) +* [Step Function](#step-function) +* [Local Development](#local-development) + * [MacOS](#macos) + + # About bignbit is a Cumulus module that can be installed as a post-ingest workflow to generate browse imagery via Harmony and then transfer that imagery to GIBS. -See an example of how to use this cumulus module in [browse_image_workflow.tf](/examples/cumulus-tf/browse_image_workflow.tf). +In general, the high level steps are: -_Visual representation of the bignbit step function state machine:_ -![image](https://github.com/podaac/bignbit/assets/89428916/4db5ae4b-ca74-4bee-bee7-2d7d1a342bd7) +1. For each configured variable within the granule being processed, generate browse imagery via Harmony and store it in S3. +2. Generate a browse image metadata file for GIBS for each image produced by Harmony. +3. Construct a CNM message for each image that includes the image, metadata, and optional world file +4. Send the CNM messages to GIBS via SQS. +5. Wait for GIBS to process the CNM messages and send a success or failure response back to an SNS topic. +6. Record the result of GIBS processing in S3. + +# Installing this module + +1. Add a post-ingest workflow to the cumulus ingest workflow. For example: + ``` + { + "StartAt":"BIGChoice", + "States":{ + "BIGChoice":{ + "Type":"Choice", + "Choices":[ + { + "And":[ + { + "Variable":"$.meta.collection.meta.workflowChoice.browseimage", + "IsPresent":true + }, + { + "Variable":"$.meta.collection.meta.workflowChoice.browseimage", + "BooleanEquals":true + } + ], + "Next":"QueueGranulesToBIG" + } + ], + "Default":"BIGSucceed" + }, + "QueueGranulesToBIG":{ + "Parameters":{ + "cma":{ + "event.$":"$", + "task_config":{ + "provider":"{$.meta.provider}", + "internalBucket":"{$.meta.buckets.internal.name}", + "stackName":"{$.meta.stack}", + "granuleIngestWorkflow":"BrowseImageWorkflow", + "queueUrl": "${aws_sqs_queue.big_background_job_queue.id}" + } + } + }, + "Type":"Task", + "Resource":"${module.cumulus.queue_granules_task.task_arn}", + "Retry":[ + { + "ErrorEquals":[ + "States.ALL" + ], + "IntervalSeconds":5, + "MaxAttempts":3 + } + ], + "Catch":[ + { + "ErrorEquals":[ + "States.ALL" + ], + "ResultPath":"$.exception", + "Next":"BIGFail" + } + ], + "Next": "BIGSucceed" + }, + "BIGFail":{ + "Type":"Fail" + }, + "BIGSucceed":{ + "Type":"Succeed" + } + } + ``` +2. Add a new terraform script to the `cumulus-deploy-tf` scripts used to deploy cumulus. This script +should define the bignbit module and the bignbit step function state machine. See an example in [browse_image_workflow.tf](/examples/cumulus-tf/browse_image_workflow.tf). +3. [Configure one or more collections](#configuring-a-collection) + + +# Configuring a collection + +1. Add config file to the `config_bucket`. The file should be named "_collection shortname_.cfg" and the contents should be JSON +2. Associate the UMM-C record to the appropriate Harmony service (HyBIG, net2cog, etc...) + +## Harmony requests + +> [!IMPORTANT] +> bignbit uses the [user owned bucket](https://harmony.earthdata.nasa.gov/docs#user-owned-buckets-for-harmony-output) parameter +> when making Harmony requests. If an existing bucket is configured for the `harmony_staging_bucket` parameter, it must +> have a bucket policy that allows Harmony to write objects to it. If `harmony_staging_bucket` is left blank, bignbit will +> create a new S3 bucket (named `{app_name}-{stage}-harmony-staging`) and apply the correct permissions automatically. This bucket will also automatically expire objects +> older than 30 days. + +bignbit uses the harmony-py library to construct the Harmony requests for generating images. Most of the parameters +are extracted from the CMA message as a granule is being processed but the `width` and `height` parameters +can be set via configuration. **Each variable** configured for imaging will result in a unique call to Harmony. + +See `bignbit.submit_harmony_job.generate_harmony_request` for details on how the Harmony request is constructed. + +# Module Inputs + +This module uses the following input variables: + +| Name | Type | Description | Default Value | +|----------------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| +| stage | string | Environment used for resource tagging (dev, int, ops, etc...) | | +| prefix | string | Prefix used for resource naming (project name, env name, etc...) | | +| config_bucket | string | Bucket where dataset configuration is stored | | +| config_dir | string | Path relative to `config_bucket` where dataset configuration is stored | "datset-config" | +| pobit_audit_bucket | string | S3 bucket where messages exchanged with GITC will be saved. Typically the cumulus internal bucket | | +| pobit_audit_path | string | Path relative to `pobit_audit_bucket` where messages exchanged with GITC will be saved. | "pobit-cma-output" | +| harmony_staging_bucket | string | S3 bucket where Harmony results will be saved. Leave blank to use bucket managed by this module. | _create new bucket named {app_name}-{stage}-harmony-staging_ | +| harmony_staging_path | string | Path relative to `harmony_staging_bucket` where harmony results will be saved. | "bignbit-harmony-output" | +| gibs_region | string | Region where GIBS resources are deployed | | +| gibs_queue_name | string | Name of the GIBS SQS queue where outgoing CNM messages will be sent | | +| gibs_account_id | string | AWS account ID for GIBS | | +| edl_user_ssm | string | Name of SSM parameter containing EDL username for querying CMR | | +| edl_pass_ssm | string | Name of SSM parameter containing EDL password for querying CMR | | +| permissions_boundary_arn | string | Permissions boundary ARN to apply to the roles created by this module. If not provided, no permissions boundary will be applied. | | +| security_group_ids | list(string) | | | +| subnet_ids | list(string) | | | +| app_name | string | | "bignbit" | +| default_tags | map(string) | | {} | +| lambda_container_image_uri | string | | "" | + + +# Module Outputs + +This module supplies the following outputs: + +| Name | Description | Value | +|----------------------------------|-------------------------------------------------------------------|------------------------------------------------------| +| config_bucket_name | Bucket containing dataset configs | var.config_bucket | +| config_path | Path relative to config bucket where configs reside | var.config_dir | +| pobit_handle_gitc_response_arn | ARN of the lambda function | aws_lambda_function.handle_gitc_response.arn | +| pobit_gibs_topic | ARN of SNS topic GIBS replies to | aws_sns_topic.gibs_response_topic.arn | +| pobit_gibs_queue | ARN of SQS queue GIBS replies are published to | aws_sqs_queue.gibs_response_queue.arn | +| pobit_audit_bucket | Name of bucket where messages exchanged with GIBS are stored | var.pobit_audit_bucket | +| pobit_audit_path | Path relative to audit bucket where messages with GIBS are stored | var.pobit_audit_path | +| get_dataset_configuration_arn | ARN of the lambda function | aws_lambda_function.get_dataset_configuration.arn | +| get_granule_umm_json_arn | ARN of the lambda function | aws_lambda_function.get_granule_umm_json.arn | +| get_collection_concept_id_arn | ARN of the lambda function | aws_lambda_function.get_collection_concept_id.arn | +| identify_image_file_arn | ARN of the lambda function | aws_lambda_function.identify_image_file.arn | +| generate_image_metadata_arn | ARN of the lambda function | aws_lambda_function.generate_image_metadata.arn | +| submit_harmony_job_arn | ARN of the lambda function | aws_lambda_function.submit_harmony_job.arn | +| submit_harmony_job_function_name | Name of the lambda function | aws_lambda_function.submit_harmony_job.function_name | +| get_harmony_job_status_arn | ARN of the lambda function | aws_lambda_function.get_harmony_job_status.arn | +| process_harmony_results_arn | ARN of the lambda function | aws_lambda_function.process_harmony_results.arn | +| apply_opera_hls_treatment_arn | ARN of the lambda function | aws_lambda_function.apply_opera_hls_treatment.arn | +| pobit_build_image_sets_arn | ARN of the lambda function | aws_lambda_function.build_image_sets.arn | +| pobit_send_to_gitc_arn | ARN of the lambda function | aws_lambda_function.send_to_gitc.arn | +| pobit_save_cnm_message_arn | ARN of the lambda function | aws_lambda_function.save_cnm_message.arn | +| workflow_definition | Rendered state machine definition | rendered version of state_machine_definition.tpl | +| harmony_staging_bucket | Name of harmony staging bucket | var.harmony_staging_bucket | +| harmony_staging_path | Path to harmony requests relative to harmony staging bucket | var.harmony_staging_path | # Assumptions - Using `ContentBasedDeduplication` strategy for GITC input queue +# Step Function + +_Visual representation of the bignbit step function state machine:_ +![image](https://github.com/podaac/bignbit/assets/89428916/4db5ae4b-ca74-4bee-bee7-2d7d1a342bd7) + # Local Development ## MacOS diff --git a/bignbit/copy_harmony_output_to_s3.py b/bignbit/copy_harmony_output_to_s3.py deleted file mode 100644 index 1bba519..0000000 --- a/bignbit/copy_harmony_output_to_s3.py +++ /dev/null @@ -1,133 +0,0 @@ -# pylint: disable=protected-access -"""Cumulus lambda class to create copy harmony job results into s3""" - -import logging -import os -import botocore -from cumulus_logger import CumulusLogger -from cumulus_process import Process, s3 - -from bignbit import utils - -CUMULUS_LOGGER = CumulusLogger('copy_harmony_output_to_s3') - - -class CMA(Process): - """Cumulus class to copy harmony results to s3""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.logger = CUMULUS_LOGGER - - def process(self): - """ - Copys the resulting files of a harmony call to s3 - - Returns - ---------- - CMA message - """ - files = self.input.get('granules')[0].get('files') - data_file = None - for file in files: - if file.get('type') == 'data': - data_file = file - - uploaded_files = copy_harmony_to_s3(self.config, self.path, data_file) - self.input['big'] = uploaded_files - return self.input - - -def copy_harmony_to_s3(config, path, data_file): - """Function to copy harmony resutls into s3 and retunr list of dict with info on new file""" - - harmony_job = config.get('harmony_job') - cmr_env = config.get('cmr_environment') - harmony_client = utils.get_harmony_client(cmr_env) - urls = harmony_client.result_urls(harmony_job) - current_item = config.get('current_item') - variable = current_item.get('id') - prefix = os.path.dirname(data_file['key']) - bucket = data_file.get('bucket') - - uploaded_files = [] - - for url in urls: - - local_file = harmony_client._download_file(url, directory=path, overwrite=True) - output_file_basename = os.path.basename(local_file) - - upload_file_dict = { - "fileName": output_file_basename, - "bucket": bucket, - "key": f'{prefix}/{output_file_basename}', - "size": os.path.getsize(local_file), - "checksumType": "SHA512", - "checksum": utils.sha512sum(local_file), - "variable": variable - } - - s3_link = f's3://{upload_file_dict["bucket"]}/{upload_file_dict["key"]}' - upload_file_to_s3(local_file, s3_link) - uploaded_files.append(upload_file_dict) - - return uploaded_files - - -def upload_file_to_s3(filename, uri): - """ Upload a local file to s3 if collection payload provided - - Parameters - ---------- - filename: str - path location of the file - uri: str - s3 string of file location - Returns - ---------- - None - """ - try: - return s3.upload(filename, uri, extra={}) - except botocore.exceptions.ClientError as ex: - base_file = os.path.basename(os.path.basename(filename)) - CUMULUS_LOGGER.error( - f"Error uploading file {base_file}: {ex}", - exc_info=True - ) - raise ex - - -def lambda_handler(event, context): - """handler that gets called by aws lambda - Parameters - ---------- - event: dictionary - event from a lambda call - context: dictionary - context from a lambda call - Returns - ---------- - dict - A CMA json message - """ - - levels = { - 'critical': logging.CRITICAL, - 'error': logging.ERROR, - 'warn': logging.WARNING, - 'warning': logging.WARNING, - 'info': logging.INFO, - 'debug': logging.DEBUG - } - - logging_level = os.environ.get('LOGGING_LEVEL', 'info') - CUMULUS_LOGGER.logger.level = levels.get(logging_level, 'info') - CUMULUS_LOGGER.setMetadata(event, context) - - cumulus_results = CMA.cumulus_handler(event, context=context) - return cumulus_results.get('payload').get('big') - - -if __name__ == "__main__": - CMA() diff --git a/bignbit/generate_image_metadata.py b/bignbit/generate_image_metadata.py index 929bb3c..a9901c0 100644 --- a/bignbit/generate_image_metadata.py +++ b/bignbit/generate_image_metadata.py @@ -94,7 +94,7 @@ def generate_metadata(cma_file_list: List[Dict], granule_umm_json: dict, temp_di granule_type = "browse" if granule_extension in BROWSE_IMAGE_EXTENSION_SUBTYPES else "metadata" if granule_type == "browse": granule_subtype = BROWSE_IMAGE_EXTENSION_SUBTYPES.get(granule_extension, None) - elif granule_extension.lower() == '.wld': + elif granule_extension.lower() == '.wld' or granule_extension.lower() == '.pgw' : granule_subtype = "world file" else: granule_subtype = None diff --git a/bignbit/image_set.py b/bignbit/image_set.py index 5f93e6b..2a9c27b 100644 --- a/bignbit/image_set.py +++ b/bignbit/image_set.py @@ -51,7 +51,7 @@ def from_big_output(big_output: List[typing.Dict]) -> List[ImageSet]: try: image_metadata = next(iter([g for g in big_output if g['type'] == 'metadata' - and g['subtype'] == 'ImageMetadata-v1.2' + and g.get('subtype', None) == 'ImageMetadata-v1.2' and pathlib.Path(g['fileName']).stem == image_name])) except StopIteration as ex: raise IncompleteImageSet(f"Missing image metadata for {image}") from ex @@ -59,7 +59,7 @@ def from_big_output(big_output: List[typing.Dict]) -> List[ImageSet]: try: world_file = next(iter([g for g in big_output if g['type'] == 'metadata' - and g['subtype'] == 'world file' + and g.get('subtype', None) == 'world file' and pathlib.Path(g['fileName']).stem == image_name])) except StopIteration: # World files are not always required diff --git a/bignbit/process_harmony_results.py b/bignbit/process_harmony_results.py new file mode 100644 index 0000000..8d8c679 --- /dev/null +++ b/bignbit/process_harmony_results.py @@ -0,0 +1,113 @@ +"""Cumulus lambda class to extract details about the results from the Harmony job""" +import logging +import os +from urllib.parse import urlparse + +from cumulus_logger import CumulusLogger +from cumulus_process import Process +from harmony import LinkType + +from bignbit import utils + +CUMULUS_LOGGER = CumulusLogger('process_harmony_results') + + +class CMA(Process): + """Cumulus class to read the output from a harmony job""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.logger = CUMULUS_LOGGER + + def process(self): + """ + 1. Build harmony request for input variable, collection concept id, and granule concept id + 2. Submit request + 3. Put harmony job id into the output payload + + Returns + ---------- + CMA message + """ + + harmony_job = self.config.get("harmony_job") + cmr_env = self.config.get("cmr_environment") + variable = self.config.get("variable") + + return process_results(harmony_job, cmr_env, variable) + + +def process_results(harmony_job_id: str, cmr_env: str, variable: str): + """ + Process the results of a Harmony job + + Parameters + ---------- + harmony_job_id : str + The ID of the Harmony job to process + cmr_env : str + The CMR environment to use + variable : str + The variable being processed + + Returns + ---------- + dict + A list of CMA file dictionaries pointing to the transformed image(s) + """ + harmony_client = utils.get_harmony_client(cmr_env) + result_urls = list(harmony_client.result_urls(harmony_job_id, link_type=LinkType.s3)) + + CUMULUS_LOGGER.info("Processing {} result files for {}", len(result_urls), variable) + CUMULUS_LOGGER.debug("Results: {}", result_urls) + + file_dicts = [] + for url in result_urls: + bucket, key = urlparse(url).netloc, urlparse(url).path.lstrip("/") + filename = key.split("/")[-1] + file_dict = { + "fileName": filename, + "bucket": bucket, + "key": key + } + # Weird quirk where if we are working with a collection that doesn't define variables, the Harmony request + # should specify 'all' as the variable value but the GIBS message should be sent with the variable set to 'none' + if variable.lower() != 'all': + file_dict['variable'] = variable + file_dicts.append(file_dict) + + return file_dicts + + +def lambda_handler(event, context): + """handler that gets called by aws lambda + Parameters + ---------- + event: dictionary + event from a lambda call + context: dictionary + context from a lambda call + Returns + ---------- + dict + A CMA json message + """ + + levels = { + 'critical': logging.CRITICAL, + 'error': logging.ERROR, + 'warn': logging.WARNING, + 'warning': logging.WARNING, + 'info': logging.INFO, + 'debug': logging.DEBUG + } + + logging_level = os.environ.get('LOGGING_LEVEL', 'info') + CUMULUS_LOGGER.logger.level = levels.get(logging_level, 'info') + CUMULUS_LOGGER.setMetadata(event, context) + + return CMA.cumulus_handler(event, context=context) + + +if __name__ == "__main__": + CMA() diff --git a/bignbit/submit_harmony_job.py b/bignbit/submit_harmony_job.py index 087a7f3..e17b6e9 100644 --- a/bignbit/submit_harmony_job.py +++ b/bignbit/submit_harmony_job.py @@ -1,11 +1,11 @@ """Cumulus lambda class to create harmony job""" - +import datetime import logging import os from cumulus_logger import CumulusLogger from cumulus_process import Process -from harmony import BBox, Collection, Request +from harmony import Collection, Request from bignbit import utils CUMULUS_LOGGER = CumulusLogger('submit_harmony_job') @@ -29,34 +29,34 @@ def process(self): CMA message """ - harmony_job = create_harmony_job(self.config) + cmr_env = self.config.get('cmr_environment') + collection_concept_id = self.config.get('collection_concept_id') + collection_name = self.config.get('collection').get('name') + granule = self.config.get('granule') + granule_concept_id = granule.get('cmrConceptId') + granule_id = granule.get('granuleId') + current_item = self.config.get('current_item') + variable = current_item.get('id') + big_config = self.config.get('big_config') + harmony_staging_bucket = self.config.get('harmony_staging_bucket') + harmony_staging_path = self.config.get('harmony_staging_path') + + harmony_job = submit_harmony_job(cmr_env, collection_concept_id, collection_name, granule_concept_id, + granule_id, variable, big_config, harmony_staging_bucket, harmony_staging_path) self.input['harmony_job'] = harmony_job return self.input -def create_harmony_job(config): +def submit_harmony_job(cmr_env, collection_concept_id, collection_name, granule_concept_id, granule_id, variable, + big_config, harmony_staging_bucket, harmony_staging_path): """Generate harmony job and returns harmony job id""" - cmr_env = config.get('cmr_environment') - collection_concept_id = config.get('collection_concept_id') - granule = config.get('granule') - granule_concept_id = granule.get('cmrConceptId') - granule_id = granule.get('granuleId') - current_item = config.get('current_item') - variable = current_item.get('id') - big_config = config.get('big_config') - - files = granule.get('files') - destination_bucket_url = None - for file in files: - if file.get('type') == 'data': - file_path = os.path.dirname(file.get('key')) - bucket_name = file.get('bucket') - destination_bucket_url = f's3://{bucket_name}/{file_path}' - + destination_bucket_url = f's3://{harmony_staging_bucket}/{harmony_staging_path}/{collection_name}/{datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%d")}'.lower() harmony_client = utils.get_harmony_client(cmr_env) - harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, destination_bucket_url) + harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, + destination_bucket_url) + CUMULUS_LOGGER.info("Submitting Harmony request: {}", harmony_client.request_as_url(harmony_request)) job = harmony_client.submit(harmony_request) harmony_job = { 'job': job, @@ -75,7 +75,6 @@ def generate_harmony_request(collection_concept_id, granule_concept_id, variable collection=Collection(id=collection_concept_id), granule_id=[granule_concept_id], variables=[variable], - spatial=BBox(-180, -90, 180, 90), width=big_config['config']['width'], height=big_config['config']['height'], format="image/png", @@ -111,7 +110,6 @@ def lambda_handler(event, context): CUMULUS_LOGGER.logger.level = levels.get(logging_level, 'info') CUMULUS_LOGGER.setMetadata(event, context) - CUMULUS_LOGGER.info(event) return CMA.cumulus_handler(event, context=context) diff --git a/docker/Dockerfile b/docker/Dockerfile index 0ba65bd..773ad55 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,7 @@ ARG FUNCTION_DIR="/home/dockeruser/app" ARG GDAL_VERSION="3.6.3" -FROM osgeo/gdal:ubuntu-small-${GDAL_VERSION} as build-image +FROM osgeo/gdal:ubuntu-small-${GDAL_VERSION} AS build-image # Include global arg in this stage of the build ARG FUNCTION_DIR @@ -38,7 +38,7 @@ FROM osgeo/gdal:ubuntu-small-${GDAL_VERSION} ARG FUNCTION_DIR RUN adduser --quiet --disabled-password --shell /bin/sh --home /home/dockeruser --gecos "" --uid 993 dockeruser USER dockeruser -ENV HOME /home/dockeruser +ENV HOME=/home/dockeruser WORKDIR ${FUNCTION_DIR} COPY --chown=dockeruser --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} diff --git a/examples/cumulus-tf/.terraform.lock.hcl b/examples/cumulus-tf/.terraform.lock.hcl index a6bbfe7..219e048 100644 --- a/examples/cumulus-tf/.terraform.lock.hcl +++ b/examples/cumulus-tf/.terraform.lock.hcl @@ -2,63 +2,44 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "5.41.0" - constraints = ">= 2.31.0, >= 3.0.0, != 3.14.0" + version = "5.80.0" + constraints = ">= 3.9.0" hashes = [ - "h1:SgIWBDBA1uNB/Y7CaLFeNX/Ju2xboSSQmRv35Vbi46M=", - "h1:uNln7837/ZTVgQBk+hhfgB9Y87icES6X0lMSOfK5c7g=", - "zh:0553331a6287c146353b6daf6f71987d8c000f407b5e29d6e004ea88faec2e67", - "zh:1a11118984bb2950e8ee7ef17b0f91fc9eb4a42c8e7a9cafd7eb4aca771d06e4", - "zh:236fedd266d152a8233a7fe27ffdd99ca27d9e66a9618a988a4c3da1ac24a33f", - "zh:34bc482ea04cf30d4d216afa55eecf66854e1acf93892cb28a6b5af91d43c9b7", - "zh:39d7eb15832fe339bf46e3bab9852280762a1817bf1afc459eecd430e20e3ad5", - "zh:39fb07429c51556b05170ec2b6bd55e2487adfe1606761eaf1f2a43c4bb20e47", - "zh:71d7cd3013e2f3fa0f65194af29ee6f5fa905e0df2b72b723761dc953f4512ea", + "h1:q2pqSs7uPWvxunrBYjyirXARlxFIoxn2Lju42uJbxk4=", + "zh:0b1655e39639d60f2de2860a5df8642f9556ba0ca04529c1b861fde4935cb0df", + "zh:13dc0155e0a11edceee29ce687fc04c5a5a85f3324c67556472713cfd52e5807", + "zh:180f6cb2be44be14cfe329e0649121b774319f083b6e4e8fb749f85090d73121", + "zh:3158d44b74c67465f7f19f22c42b643840c8d18ce833e2ec86e8d93085b06926", + "zh:6351b5bf7cde5dc83e926944891570636069e05ca43341f4d1feda67773469bf", + "zh:6fa9db1532096ba50e842d369b6688979306d2295c7ead49b8a266b0d60962cc", + "zh:85d2fe75def7619ff2cc29102048875039cad088fafb62ecc14c3763e7b1e9d9", + "zh:9028d653f1d7341c6dfe2afe961b6541581e9043a474eac2faf90e6426a24f6d", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:9b271ae12394e7e2ce6da568b42226a146e90fd705e02a670fcb93618c4aa19f", - "zh:a884dd978859d001709681f9513ba0fbb0753d1d459a7f3434ecc5f1b8699c49", - "zh:b8c3c7dc10ae4f6143168042dcf8dee63527b103cc37abc238ea06150af38b6e", - "zh:ba94ffe0893ad60c0b70c402e163b4df2cf417e93474a9cc1a37535bba18f22d", - "zh:d5ba851d971ff8d796afd9a100acf55eaac0c197c6ab779787797ce66f419f0e", - "zh:e8c090d0c4f730c4a610dc4f0c22b177a0376d6f78679fc3f1d557b469e656f4", - "zh:ed7623acde26834672969dcb5befdb62900d9f216d32e7478a095d2b040a0ea7", + "zh:9c4e248c442bc60f07f9f089e5361f19936833370dc3c04b27916672b765f0e1", + "zh:a710a3979596e3f3938c3ec6bb748e604724d3a4afa96ed2c14f0a245cc41a11", + "zh:c27936bdf447779d0c0833bf52a9ef618985f5ea8e3e243d6266513520ca31c4", + "zh:c7681134a123486e72eaedc3f8d2d75e267dbbfd45fa7de5aea8f757af57f89b", + "zh:ea717ebad3561fd02591f9eecf30f3df5635405556fba2bdbf29fd42691bebac", + "zh:f4e1e8f23c58c3e8f4371f9c3379a723ab4155246e6b6daad8eb99e16666b2cb", ] } provider "registry.terraform.io/hashicorp/null" { - version = "2.1.2" - constraints = "~> 2.1" + version = "3.2.3" + constraints = "~> 3.0" hashes = [ - "h1:CFnENdqQu4g3LJNevA32aDxcUz2qGkRGQpFfkI8TCdE=", - "h1:l0/ASa/TB1exgqdi33sOkFakJL2zAQBu+q5LgO5/SxI=", - "zh:0cc7236c1fbf971b8bad1540a7d0c5ac4579248239fd1034c023b0b660a8d1d5", - "zh:16fc2d9b10cf9e5123bf956e7032c338cc93a03be1ca2e9f3d3b7014c0e866c7", - "zh:1e26465ff40ded59cef1a9e745752eef9744471e69094d12f8bc40a060e8cdb9", - "zh:3c7afd28076245f455d4348af6c124b73409722be4a73680d4e4709a4f25ea91", - "zh:4190a92567efaa444527f19b28d65fac1a01aeba907013b5dceacd9ba2a23709", - "zh:677963437316b088fc1aac70fe7d608d2917c46530c4a25ec86a43e9acaf2811", - "zh:69fe15f6b851ff82700bc749c50a9299770515617e677c18cba2cb697daaff36", - "zh:6b505cc60cc1494e1cab61590bca127b06dd894d0b2a7dcacd23862bce1f492b", - "zh:719aa11ad7be974085af595089478eb24d5a021bc7b08364fa6745d9eb473dac", - "zh:7375b02189e14efbfaab994cd05d81e3ff8e46041fae778598b3903114093a3e", - "zh:c406573b2084a08f8faa0451923fbeb1ca6c5a5598bf039589ec2db13aacc622", - "zh:fb11299a3b20711595713d126abbbe78c554eb5995b02db536e9253686798fb6", - ] -} - -provider "registry.terraform.io/hashicorp/template" { - version = "2.2.0" - hashes = [ - "h1:94qn780bi1qjrbC3uQtjJh3Wkfwd5+tTtJHOb7KTg9w=", - "zh:01702196f0a0492ec07917db7aaa595843d8f171dc195f4c988d2ffca2a06386", - "zh:09aae3da826ba3d7df69efeb25d146a1de0d03e951d35019a0f80e4f58c89b53", - "zh:09ba83c0625b6fe0a954da6fbd0c355ac0b7f07f86c91a2a97849140fea49603", - "zh:0e3a6c8e16f17f19010accd0844187d524580d9fdb0731f675ffcf4afba03d16", - "zh:45f2c594b6f2f34ea663704cc72048b212fe7d16fb4cfd959365fa997228a776", - "zh:77ea3e5a0446784d77114b5e851c970a3dde1e08fa6de38210b8385d7605d451", - "zh:8a154388f3708e3df5a69122a23bdfaf760a523788a5081976b3d5616f7d30ae", - "zh:992843002f2db5a11e626b3fc23dc0c87ad3729b3b3cff08e32ffb3df97edbde", - "zh:ad906f4cebd3ec5e43d5cd6dc8f4c5c9cc3b33d2243c89c5fc18f97f7277b51d", - "zh:c979425ddb256511137ecd093e23283234da0154b7fa8b21c2687182d9aea8b2", + "h1:I0Um8UkrMUb81Fxq/dxbr3HLP2cecTH2WMJiwKSrwQY=", + "zh:22d062e5278d872fe7aed834f5577ba0a5afe34a3bdac2b81f828d8d3e6706d2", + "zh:23dead00493ad863729495dc212fd6c29b8293e707b055ce5ba21ee453ce552d", + "zh:28299accf21763ca1ca144d8f660688d7c2ad0b105b7202554ca60b02a3856d3", + "zh:55c9e8a9ac25a7652df8c51a8a9a422bd67d784061b1de2dc9fe6c3cb4e77f2f", + "zh:756586535d11698a216291c06b9ed8a5cc6a4ec43eee1ee09ecd5c6a9e297ac1", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:9d5eea62fdb587eeb96a8c4d782459f4e6b73baeece4d04b4a40e44faaee9301", + "zh:a6355f596a3fb8fc85c2fb054ab14e722991533f87f928e7169a486462c74670", + "zh:b5a65a789cff4ada58a5baffc76cb9767dc26ec6b45c00d2ec8b1b027f6db4ed", + "zh:db5ab669cf11d0e9f81dc380a6fdfcac437aea3d69109c7aef1a5426639d2d65", + "zh:de655d251c470197bcbb5ac45d289595295acb8f829f6c781d4a75c8c8b7c7dd", + "zh:f5c68199f2e6076bce92a12230434782bf768103a427e9bb9abee99b116af7b5", ] } diff --git a/examples/cumulus-tf/bignbit.tf b/examples/cumulus-tf/bignbit.tf deleted file mode 100644 index 42012fd..0000000 --- a/examples/cumulus-tf/bignbit.tf +++ /dev/null @@ -1,24 +0,0 @@ -module "bignbit_module" { - source = "../../terraform" - prefix = var.prefix - stage = var.stage - region = var.region - lambda_role = aws_iam_role.iam_execution - security_group_ids = [] - subnet_ids = [] - app_name = var.app_name - lambda_container_image_uri = var.lambda_container_image_uri - - default_tags = local.default_tags - - config_bucket = aws_s3_bucket.internal.bucket - config_dir = "dataset-config" - - edl_user_ssm = var.edl_user_ssm - edl_pass_ssm = var.edl_pass_ssm - - pobit_audit_bucket = aws_s3_bucket.internal.bucket - gibs_region = var.gibs_region == "mocked" ? "us-west-2" : var.gibs_region - gibs_queue_name = var.gibs_queue_name == "mocked" ? aws_sqs_queue.gitc_input_queue[0].name : var.gibs_queue_name - gibs_account_id = var.gibs_account_id == "mocked" ? local.account_id : var.gibs_account_id -} diff --git a/examples/cumulus-tf/browse_image_workflow.tf b/examples/cumulus-tf/browse_image_workflow.tf index 94faf20..0d5dfed 100644 --- a/examples/cumulus-tf/browse_image_workflow.tf +++ b/examples/cumulus-tf/browse_image_workflow.tf @@ -1,3 +1,37 @@ +locals { + bignbit_appname = "bignbit" +} + +module "bignbit_module" { + source = "../../terraform" + + stage = var.bignbit_stage + prefix = var.prefix + + config_bucket = aws_s3_bucket.internal.bucket + config_dir = "dataset-config" + + pobit_audit_bucket = aws_s3_bucket.internal.bucket + + gibs_region = var.gibs_region == "mocked" ? "us-west-2" : var.gibs_region + gibs_queue_name = var.gibs_queue_name == "mocked" ? aws_sqs_queue.gitc_input_queue[0].name : var.gibs_queue_name + gibs_account_id = var.gibs_account_id == "mocked" ? local.account_id : var.gibs_account_id + + edl_user_ssm = var.edl_user + edl_pass_ssm = var.edl_pass + + permissions_boundary_arn = var.permissions_boundary_arn + security_group_ids = [] + subnet_ids = [] + + app_name = local.bignbit_appname + default_tags = merge(local.default_tags, { + application = local.bignbit_appname, + Version = var.app_version + }) + lambda_container_image_uri = var.lambda_container_image_uri +} + /* In a typical cumulus installation, this is how you would define the workflow: @@ -20,5 +54,4 @@ resource "aws_sfn_state_machine" "sfn_state_machine" { role_arn = aws_iam_role.step.arn definition = module.bignbit_module.workflow_definition - #tags = var.tags } diff --git a/examples/cumulus-tf/fake_gitc.tf b/examples/cumulus-tf/fake_gitc.tf index 2fdb077..8896445 100644 --- a/examples/cumulus-tf/fake_gitc.tf +++ b/examples/cumulus-tf/fake_gitc.tf @@ -19,7 +19,7 @@ resource "aws_sqs_queue" "gitc_input_deadletter" { content_based_deduplication = true redrive_allow_policy = jsonencode({ redrivePermission = "byQueue", - sourceQueueArns = ["arn:aws:sqs:${var.region}:${local.account_id}:${local.ec2_resources_name}-fake-gitc-IN.fifo"] + sourceQueueArns = ["arn:aws:sqs:${data.aws_region.current.name}:${local.account_id}:${local.ec2_resources_name}-fake-gitc-IN.fifo"] }) } diff --git a/examples/cumulus-tf/iam.tf b/examples/cumulus-tf/iam.tf index fce85a4..5e23283 100644 --- a/examples/cumulus-tf/iam.tf +++ b/examples/cumulus-tf/iam.tf @@ -1,5 +1,3 @@ -data "aws_caller_identity" "current" {} - data "aws_iam_policy_document" "iam_assume_role_policy" { statement { effect = "Allow" diff --git a/examples/cumulus-tf/iam_step.tf b/examples/cumulus-tf/iam_step.tf index ca636cb..bf689be 100644 --- a/examples/cumulus-tf/iam_step.tf +++ b/examples/cumulus-tf/iam_step.tf @@ -1,4 +1,3 @@ -data "aws_region" "current" {} data "aws_iam_policy_document" "states_assume_role_policy" { statement { diff --git a/examples/cumulus-tf/main.tf b/examples/cumulus-tf/main.tf index 346815c..f586fe0 100644 --- a/examples/cumulus-tf/main.tf +++ b/examples/cumulus-tf/main.tf @@ -1,7 +1,13 @@ terraform { required_providers { - aws = ">= 2.31.0" - null = "~> 2.1" + aws = { + source = "hashicorp/aws" + version = ">= 3.9.0" + } + null = { + source = "hashicorp/null" + version = "~> 3" + } } } @@ -11,22 +17,29 @@ provider "aws" { ignore_tags { key_prefixes = ["gsfc-ngap"] } + + default_tags { + tags = local.default_tags + } } +data "aws_caller_identity" "current" {} +data "aws_region" "current" {} + + locals { - name = var.app_name - environment = var.stage + environment = var.bignbit_stage # This is the convention we use to know what belongs to each other - ec2_resources_name = terraform.workspace == "default" ? "svc-${local.environment}-${local.name}" : "svc-${local.environment}-${local.name}-${terraform.workspace}" + ec2_resources_name = terraform.workspace == "default" ? var.prefix : "${var.prefix}-${terraform.workspace}" # Account ID used for getting the ECR host account_id = data.aws_caller_identity.current.account_id - default_tags = length(var.default_tags) == 0 ? { + default_tags = { team: "TVA", application: local.ec2_resources_name, - Environment = var.stage + Environment = var.bignbit_stage Version = var.app_version - } : var.default_tags + } } diff --git a/examples/cumulus-tf/tfvars/sit.tfvars b/examples/cumulus-tf/tfvars/sit.tfvars index 64c10b3..f146aa9 100644 --- a/examples/cumulus-tf/tfvars/sit.tfvars +++ b/examples/cumulus-tf/tfvars/sit.tfvars @@ -1,6 +1,6 @@ # stage: dev, sandbox, sit, uat, prod -stage = "sit" -prefix = "bignbit-svc" +bignbit_stage = "sit" +prefix = "podaac-sit-svc" gibs_region="mocked" gibs_queue_name="mocked" diff --git a/examples/cumulus-tf/tfvars/uat.tfvars b/examples/cumulus-tf/tfvars/uat.tfvars index 1c82643..5dca679 100644 --- a/examples/cumulus-tf/tfvars/uat.tfvars +++ b/examples/cumulus-tf/tfvars/uat.tfvars @@ -1,6 +1,6 @@ # stage: dev, sandbox, sit, uat, prod -stage = "uat" -prefix = "bignbit-svc" +bignbit_stage = "uat" +prefix = "podaac-uat-svc" gibs_region="us-west-2" gibs_queue_name="gitc-uat-PODAAC_IN.fifo" \ No newline at end of file diff --git a/examples/cumulus-tf/variable.tf b/examples/cumulus-tf/variable.tf index a63721d..6d0a992 100644 --- a/examples/cumulus-tf/variable.tf +++ b/examples/cumulus-tf/variable.tf @@ -1,71 +1,76 @@ -variable prefix{ - description = "prefix to aws resources" +variable "prefix" { type = string - default = "" } -variable region{ - description = "aws region" - type = string - default = "us-west-2" -} - - - -variable "cma_version" { +variable "permissions_boundary_arn" { type = string - default = "v2.0.2" + default = null } -variable "app_name" { - default = "bignbit" -} - -variable "default_tags" { - type = map(string) - default = {} -} - -variable "stage" {} -variable "app_version" {} - -variable "edl_user_ssm" { +variable "edl_user" { type = string default = "urs_podaaccloud_user" description = "Earth Data login username ssm parameter from shared infrastructure" } -variable "edl_pass_ssm" { +variable "edl_pass" { type = string default = "urs_podaaccloud_pass" description = "Earth Data login password ssm parameter from shared infrastructure" } -variable "gibs_account_id" { +variable "bignbit_stage" { type = string + description = "environment used for tagging resources" } - -variable "lambda_container_image_uri" { - type = string - default = "" +variable "big_throttled_execution_limit" { + type = number + default = 50 } -variable "edl_user" { - type = string - default = "urs_podaaccloud_user" - description = "Earth Data login username ssm parameter from shared infrastructure" +variable "big_throttled_message_limit" { + type = number + default = 50 } -variable "edl_pass" { - type = string - default = "urs_podaaccloud_pass" - description = "Earth Data login password ssm parameter from shared infrastructure" +variable "big_throttled_time_limit" { + type = number + default = 60 } variable "gibs_region" { - type = string + type = string + description = "Region GIBS endpoints reside in." + default = "us-west-2" +} + +variable "gibs_account_id" { + type = string + description = "Account ID for GIBS." + default = "" } variable "gibs_queue_name" { - type = string + type = string + description = "Queue name for GIBS SQS queue that pobit will publish messages to." + default = "gitc-prod-PODAAC-IN.fifo" +} + +variable "browse_image_module_count" { + description = "set to 0 to NOT deploy browse image module" + type = number + default = 1 +} + +variable "app_version" { + type = string +} + +variable "lambda_container_image_uri" { + type = string +} + +variable "cma_version" { + type = string + default = "v2.0.4" } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 95c8bac..d7383b9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,100 +1,113 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] -name = "aiohttp" -version = "3.9.5" -description = "Async http client/server framework (asyncio)" +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, - {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, - {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, - {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, - {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, - {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, - {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, - {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, - {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, - {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.11.10" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, + {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, + {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, + {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, + {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, + {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, + {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, + {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, + {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, + {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, + {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, + {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, ] [package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -131,33 +144,33 @@ wrapt = [ [[package]] name = "async-timeout" -version = "4.0.3" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "boto3" @@ -199,74 +212,89 @@ crt = ["awscrt (==0.16.9)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -274,101 +302,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -384,63 +427,73 @@ files = [ [[package]] name = "coverage" -version = "7.5.3" +version = "7.6.9" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.dependencies] @@ -451,43 +504,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.7" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -500,7 +548,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -584,13 +632,13 @@ files = [ [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -599,13 +647,13 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -629,88 +677,103 @@ pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "frozenlist" -version = "1.4.1" +version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, - {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, - {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] [[package]] @@ -728,13 +791,13 @@ numpy = ["numpy (>1.0.0)"] [[package]] name = "harmony-py" -version = "0.4.14" +version = "0.4.15" description = "The NASA Harmony Python library" optional = false python-versions = "<4,>=3.6" files = [ - {file = "harmony_py-0.4.14-py3-none-any.whl", hash = "sha256:fe0dc176b0c5c9762916cd4a0db1b53aeb83a08a23a42f32ddd87705ede88ee9"}, - {file = "harmony_py-0.4.14.tar.gz", hash = "sha256:d33d8579af01e5597e938e0ae768d2d411da6ca09176f22b03c95f5b462394af"}, + {file = "harmony_py-0.4.15-py3-none-any.whl", hash = "sha256:c57f8fd7d0679bf1c7a591f8b01310d64151ada111f64f2508cc6aee4f863d8f"}, + {file = "harmony_py-0.4.15.tar.gz", hash = "sha256:3c53caa6698289b8e3d5d84a8c9aea73c86481413290711979bb000685d1672b"}, ] [package.dependencies] @@ -743,6 +806,7 @@ progressbar2 = ">=4.2.0,<4.3.0" python-dateutil = ">=2.8.2,<2.9.0" python-dotenv = ">=0.20.0,<0.21.0" requests = ">=2.28,<3.0" +shapely = ">=2.0.4,<2.1.0" sphinxcontrib-napoleon = ">=0.7,<1.0" [package.extras] @@ -750,15 +814,18 @@ dev = ["PyYAML (>=6.0.1,<6.1.0)", "autopep8 (>=1.4,<2.0)", "camel-case-switcher [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-resources" version = "5.13.0" @@ -913,71 +980,72 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -1037,129 +1105,188 @@ xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "numpy" +version = "2.0.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] name = "packaging" -version = "24.0" +version = "24.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1219,6 +1346,97 @@ python-utils = ">=3.0.0" docs = ["sphinx (>=1.8.5)"] tests = ["flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "sphinx (>=1.8.5)"] +[[package]] +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] + [[package]] name = "pycodestyle" version = "2.11.1" @@ -1421,80 +1639,83 @@ files = [ [[package]] name = "python-utils" -version = "3.8.2" +version = "3.9.1" description = "Python Utils is a module with some convenient utilities not included with the standard Python install" optional = false -python-versions = ">3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "python-utils-3.8.2.tar.gz", hash = "sha256:c5d161e4ca58ce3f8c540f035e018850b261a41e7cb98f6ccf8e1deb7174a1f1"}, - {file = "python_utils-3.8.2-py2.py3-none-any.whl", hash = "sha256:ad0ccdbd6f856d015cace07f74828b9840b5c4072d9e868a7f6a14fd195555a8"}, + {file = "python_utils-3.9.1-py2.py3-none-any.whl", hash = "sha256:0273d7363c7ad4b70999b2791d5ba6b55333d6f7a4e4c8b6b39fb82b5fab4613"}, + {file = "python_utils-3.9.1.tar.gz", hash = "sha256:eb574b4292415eb230f094cbf50ab5ef36e3579b8f09e9f2ba74af70891449a0"}, ] [package.dependencies] -typing-extensions = ">3.10.0.2" +typing_extensions = ">3.10.0.2" [package.extras] docs = ["mock", "python-utils", "sphinx"] loguru = ["loguru"] -tests = ["flake8", "loguru", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mypy", "sphinx", "types-setuptools"] +tests = ["blessings", "loguru", "loguru-mypy", "mypy-ipython", "pyright", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mypy", "ruff", "sphinx", "types-setuptools"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1520,13 +1741,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "responses" -version = "0.25.0" +version = "0.25.3" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, - {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, + {file = "responses-0.25.3-py3-none-any.whl", hash = "sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb"}, + {file = "responses-0.25.3.tar.gz", hash = "sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba"}, ] [package.dependencies] @@ -1554,15 +1775,73 @@ botocore = ">=1.12.36,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +[[package]] +name = "shapely" +version = "2.0.6" +description = "Manipulation and analysis of geometric objects" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29a34e068da2d321e926b5073539fd2a1d4429a2c656bd63f0bd4c8f5b236d0b"}, + {file = "shapely-2.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c84c3f53144febf6af909d6b581bc05e8785d57e27f35ebaa5c1ab9baba13b"}, + {file = "shapely-2.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad2fae12dca8d2b727fa12b007e46fbc522148a584f5d6546c539f3464dccde"}, + {file = "shapely-2.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3304883bd82d44be1b27a9d17f1167fda8c7f5a02a897958d86c59ec69b705e"}, + {file = "shapely-2.0.6-cp310-cp310-win32.whl", hash = "sha256:3ec3a0eab496b5e04633a39fa3d5eb5454628228201fb24903d38174ee34565e"}, + {file = "shapely-2.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:28f87cdf5308a514763a5c38de295544cb27429cfa655d50ed8431a4796090c4"}, + {file = "shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e"}, + {file = "shapely-2.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a7a78b0d51257a367ee115f4d41ca4d46edbd0dd280f697a8092dd3989867b2"}, + {file = "shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855"}, + {file = "shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0"}, + {file = "shapely-2.0.6-cp311-cp311-win32.whl", hash = "sha256:d93b7e0e71c9f095e09454bf18dad5ea716fb6ced5df3cb044564a00723f339d"}, + {file = "shapely-2.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:c02eb6bf4cfb9fe6568502e85bb2647921ee49171bcd2d4116c7b3109724ef9b"}, + {file = "shapely-2.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cec9193519940e9d1b86a3b4f5af9eb6910197d24af02f247afbfb47bcb3fab0"}, + {file = "shapely-2.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83b94a44ab04a90e88be69e7ddcc6f332da7c0a0ebb1156e1c4f568bbec983c3"}, + {file = "shapely-2.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:537c4b2716d22c92036d00b34aac9d3775e3691f80c7aa517c2c290351f42cd8"}, + {file = "shapely-2.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fea108334be345c283ce74bf064fa00cfdd718048a8af7343c59eb40f59726"}, + {file = "shapely-2.0.6-cp312-cp312-win32.whl", hash = "sha256:42fd4cd4834747e4990227e4cbafb02242c0cffe9ce7ef9971f53ac52d80d55f"}, + {file = "shapely-2.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:665990c84aece05efb68a21b3523a6b2057e84a1afbef426ad287f0796ef8a48"}, + {file = "shapely-2.0.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:42805ef90783ce689a4dde2b6b2f261e2c52609226a0438d882e3ced40bb3013"}, + {file = "shapely-2.0.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6d2cb146191a47bd0cee8ff5f90b47547b82b6345c0d02dd8b25b88b68af62d7"}, + {file = "shapely-2.0.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3fdef0a1794a8fe70dc1f514440aa34426cc0ae98d9a1027fb299d45741c381"}, + {file = "shapely-2.0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c665a0301c645615a107ff7f52adafa2153beab51daf34587170d85e8ba6805"}, + {file = "shapely-2.0.6-cp313-cp313-win32.whl", hash = "sha256:0334bd51828f68cd54b87d80b3e7cee93f249d82ae55a0faf3ea21c9be7b323a"}, + {file = "shapely-2.0.6-cp313-cp313-win_amd64.whl", hash = "sha256:d37d070da9e0e0f0a530a621e17c0b8c3c9d04105655132a87cfff8bd77cc4c2"}, + {file = "shapely-2.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fa7468e4f5b92049c0f36d63c3e309f85f2775752e076378e36c6387245c5462"}, + {file = "shapely-2.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed5867e598a9e8ac3291da6cc9baa62ca25706eea186117034e8ec0ea4355653"}, + {file = "shapely-2.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81d9dfe155f371f78c8d895a7b7f323bb241fb148d848a2bf2244f79213123fe"}, + {file = "shapely-2.0.6-cp37-cp37m-win32.whl", hash = "sha256:fbb7bf02a7542dba55129062570211cfb0defa05386409b3e306c39612e7fbcc"}, + {file = "shapely-2.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:837d395fac58aa01aa544495b97940995211e3e25f9aaf87bc3ba5b3a8cd1ac7"}, + {file = "shapely-2.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c6d88ade96bf02f6bfd667ddd3626913098e243e419a0325ebef2bbd481d1eb6"}, + {file = "shapely-2.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b3b818c4407eaa0b4cb376fd2305e20ff6df757bf1356651589eadc14aab41b"}, + {file = "shapely-2.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbc783529a21f2bd50c79cef90761f72d41c45622b3e57acf78d984c50a5d13"}, + {file = "shapely-2.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2423f6c0903ebe5df6d32e0066b3d94029aab18425ad4b07bf98c3972a6e25a1"}, + {file = "shapely-2.0.6-cp38-cp38-win32.whl", hash = "sha256:2de00c3bfa80d6750832bde1d9487e302a6dd21d90cb2f210515cefdb616e5f5"}, + {file = "shapely-2.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:3a82d58a1134d5e975f19268710e53bddd9c473743356c90d97ce04b73e101ee"}, + {file = "shapely-2.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:392f66f458a0a2c706254f473290418236e52aa4c9b476a072539d63a2460595"}, + {file = "shapely-2.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eba5bae271d523c938274c61658ebc34de6c4b33fdf43ef7e938b5776388c1be"}, + {file = "shapely-2.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7060566bc4888b0c8ed14b5d57df8a0ead5c28f9b69fb6bed4476df31c51b0af"}, + {file = "shapely-2.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b02154b3e9d076a29a8513dffcb80f047a5ea63c897c0cd3d3679f29363cf7e5"}, + {file = "shapely-2.0.6-cp39-cp39-win32.whl", hash = "sha256:44246d30124a4f1a638a7d5419149959532b99dfa25b54393512e6acc9c211ac"}, + {file = "shapely-2.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:2b542d7f1dbb89192d3512c52b679c822ba916f93479fa5d4fc2fe4fa0b3c9e8"}, + {file = "shapely-2.0.6.tar.gz", hash = "sha256:997f6159b1484059ec239cacaa53467fd8b5564dabe186cd84ac2944663b0bf6"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -1582,46 +1861,76 @@ six = ">=1.5.2" [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.2" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "1.26.18" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] @@ -1631,94 +1940,91 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "websockets" -version = "12.0" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.8" -files = [ - {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, - {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, - {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, - {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, - {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, - {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, - {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, - {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, - {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, - {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, - {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, - {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, - {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, - {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, - {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +python-versions = ">=3.9" +files = [ + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] name = "werkzeug" -version = "3.0.3" +version = "3.1.3" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, - {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, ] [package.dependencies] @@ -1729,211 +2035,203 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [[package]] name = "xmltodict" -version = "0.13.0" +version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=3.4" +python-versions = ">=3.6" files = [ - {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, - {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, + {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, + {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, ] [[package]] name = "yarl" -version = "1.9.4" +version = "1.18.3" description = "Yet another URL library" optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +python-versions = ">=3.9" +files = [ + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" -version = "3.19.0" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" diff --git a/terraform/lambda_functions.tf b/terraform/lambda_functions.tf index a5a98e5..e850a81 100644 --- a/terraform/lambda_functions.tf +++ b/terraform/lambda_functions.tf @@ -5,14 +5,25 @@ locals { ecr_image_name_and_tag = split(":", element(local.lambda_container_image_uri_split, length(local.lambda_container_image_uri_split) - 1)) ecr_image_name = "${local.environment}-${element(local.ecr_image_name_and_tag, 0)}" ecr_image_tag = element(local.ecr_image_name_and_tag, 1) - build_image_sets_function_name = "${local.lambda_resources_name}-build_image_sets" - send_to_gitc_function_name = "${local.lambda_resources_name}-send_to_gitc" - handle_gitc_response_function_name = "${local.lambda_resources_name}-handle_gitc_response" + + # Truncate all function names to max 64 characters for AWS Lambda + get_dataset_configuration_function_name = substr("${local.aws_resources_name}-get_dataset_configuration", 0, 64) + get_granule_umm_json_function_name = substr("${local.aws_resources_name}-get_granule_umm_json", 0, 64) + get_collection_concept_id_function_name = substr("${local.aws_resources_name}-get_collection_concept_id", 0, 64) + identify_image_file_function_name = substr("${local.aws_resources_name}-identify_image_file", 0, 64) + submit_harmony_job_function_name = substr("${local.aws_resources_name}-submit_harmony_job", 0, 64) + generate_image_metadata_function_name = substr("${local.aws_resources_name}-generate_image_metadata", 0, 64) + get_harmony_job_status_function_name = substr("${local.aws_resources_name}-get_harmony_job_status", 0, 64) + process_harmony_results_function_name = substr("${local.aws_resources_name}-process_harmony_output", 0, 64) + apply_opera_hls_treatment_function_name = substr("${local.aws_resources_name}-apply_opera_hls_treatment", 0, 64) + build_image_sets_function_name = substr("${local.aws_resources_name}-build_image_sets", 0, 64) + send_to_gitc_function_name = substr("${local.aws_resources_name}-send_to_gitc", 0, 64) + handle_gitc_response_function_name = substr("${local.aws_resources_name}-handle_gitc_response", 0, 64) + save_cnm_message_function_name = substr("${local.aws_resources_name}-save_cnm_message", 0, 64) } resource aws_ecr_repository "lambda-image-repo" { name = local.ecr_image_name - tags = var.default_tags } @@ -38,7 +49,9 @@ resource null_resource upload_ecr_image { provisioner "local-exec" { interpreter = ["/bin/bash", "-e", "-c"] command = < /dev/null; then + docker pull ${var.lambda_container_image_uri} + fi docker tag ${var.lambda_container_image_uri} ${aws_ecr_repository.lambda-image-repo.repository_url}:${local.ecr_image_tag} docker push ${aws_ecr_repository.lambda-image-repo.repository_url}:${local.ecr_image_tag} EOF @@ -67,8 +80,8 @@ resource "aws_lambda_function" "get_dataset_configuration" { image_config { command = ["bignbit.get_dataset_configuration.lambda_handler"] } - function_name = "${local.lambda_resources_name}-get_dataset_configuration" - role = var.lambda_role.arn + function_name = local.get_dataset_configuration_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -76,7 +89,7 @@ resource "aws_lambda_function" "get_dataset_configuration" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -85,7 +98,6 @@ resource "aws_lambda_function" "get_dataset_configuration" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "get_granule_umm_json" { @@ -98,8 +110,8 @@ resource "aws_lambda_function" "get_granule_umm_json" { image_config { command = ["bignbit.get_granule_umm_json.lambda_handler"] } - function_name = "${local.lambda_resources_name}-get_granule_umm_json" - role = var.lambda_role.arn + function_name = local.get_granule_umm_json_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -109,7 +121,7 @@ resource "aws_lambda_function" "get_granule_umm_json" { EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -118,7 +130,6 @@ resource "aws_lambda_function" "get_granule_umm_json" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "get_collection_concept_id" { @@ -131,8 +142,8 @@ resource "aws_lambda_function" "get_collection_concept_id" { image_config { command = ["bignbit.get_collection_concept_id.lambda_handler"] } - function_name = "${local.lambda_resources_name}-get_collection_concept_id" - role = var.lambda_role.arn + function_name = local.get_collection_concept_id_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -142,7 +153,7 @@ resource "aws_lambda_function" "get_collection_concept_id" { EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -151,7 +162,6 @@ resource "aws_lambda_function" "get_collection_concept_id" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "identify_image_file" { @@ -164,8 +174,8 @@ resource "aws_lambda_function" "identify_image_file" { image_config { command = ["bignbit.identify_image_file.lambda_handler"] } - function_name = "${local.lambda_resources_name}-identify_image_file" - role = var.lambda_role.arn + function_name = local.identify_image_file_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -173,7 +183,7 @@ resource "aws_lambda_function" "identify_image_file" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -182,7 +192,6 @@ resource "aws_lambda_function" "identify_image_file" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "submit_harmony_job" { @@ -195,8 +204,8 @@ resource "aws_lambda_function" "submit_harmony_job" { image_config { command = ["bignbit.submit_harmony_job.lambda_handler"] } - function_name = "${local.lambda_resources_name}-submit_harmony_job" - role = var.lambda_role.arn + function_name = local.submit_harmony_job_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -204,7 +213,7 @@ resource "aws_lambda_function" "submit_harmony_job" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm } @@ -215,7 +224,6 @@ resource "aws_lambda_function" "submit_harmony_job" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "generate_image_metadata" { @@ -228,8 +236,8 @@ resource "aws_lambda_function" "generate_image_metadata" { image_config { command = ["bignbit.generate_image_metadata.lambda_handler"] } - function_name = "${local.lambda_resources_name}-generate_image_metadata" - role = var.lambda_role.arn + function_name = local.generate_image_metadata_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -237,7 +245,7 @@ resource "aws_lambda_function" "generate_image_metadata" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -246,7 +254,6 @@ resource "aws_lambda_function" "generate_image_metadata" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "get_harmony_job_status" { @@ -259,8 +266,8 @@ resource "aws_lambda_function" "get_harmony_job_status" { image_config { command = ["bignbit.get_harmony_job_status.lambda_handler"] } - function_name = "${local.lambda_resources_name}-get_harmony_job_status" - role = var.lambda_role.arn + function_name = local.get_harmony_job_status_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -268,7 +275,7 @@ resource "aws_lambda_function" "get_harmony_job_status" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm } @@ -279,10 +286,9 @@ resource "aws_lambda_function" "get_harmony_job_status" { security_group_ids = var.security_group_ids } - tags = var.default_tags } -resource "aws_lambda_function" "copy_harmony_output_to_s3" { +resource "aws_lambda_function" "process_harmony_results" { depends_on = [ null_resource.upload_ecr_image ] @@ -290,10 +296,10 @@ resource "aws_lambda_function" "copy_harmony_output_to_s3" { package_type = "Image" image_uri = "${aws_ecr_repository.lambda-image-repo.repository_url}:${local.ecr_image_tag}" image_config { - command = ["bignbit.copy_harmony_output_to_s3.lambda_handler"] + command = ["bignbit.process_harmony_results.lambda_handler"] } - function_name = "${local.lambda_resources_name}-copy_harmony_output_to_s3" - role = var.lambda_role.arn + function_name = local.process_harmony_results_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 256 @@ -301,7 +307,7 @@ resource "aws_lambda_function" "copy_harmony_output_to_s3" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm } @@ -312,7 +318,6 @@ resource "aws_lambda_function" "copy_harmony_output_to_s3" { security_group_ids = var.security_group_ids } - tags = var.default_tags } resource "aws_lambda_function" "apply_opera_hls_treatment" { @@ -325,8 +330,8 @@ resource "aws_lambda_function" "apply_opera_hls_treatment" { image_config { command = ["bignbit.apply_opera_hls_treatment.lambda_handler"] } - function_name = "${local.lambda_resources_name}-apply_opera_hls_treatment" - role = var.lambda_role.arn + function_name = local.apply_opera_hls_treatment_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 30 memory_size = 512 @@ -334,7 +339,7 @@ resource "aws_lambda_function" "apply_opera_hls_treatment" { variables = { STACK_NAME = var.prefix CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm } @@ -345,7 +350,6 @@ resource "aws_lambda_function" "apply_opera_hls_treatment" { security_group_ids = var.security_group_ids } - tags = var.default_tags } @@ -362,15 +366,15 @@ resource "aws_lambda_function" "build_image_sets" { } function_name = local.build_image_sets_function_name - role = var.lambda_role.arn + role = aws_iam_role.bignbit_lambda_role.arn timeout = 15 memory_size = 128 environment { variables = { - STACK_NAME = local.lambda_resources_name + STACK_NAME = local.aws_resources_name CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name GIBS_REGION = var.gibs_region GIBS_SQS_URL = "https://sqs.${var.gibs_region}.amazonaws.com/${var.gibs_account_id}/${var.gibs_queue_name}" } @@ -381,7 +385,6 @@ resource "aws_lambda_function" "build_image_sets" { security_group_ids = var.security_group_ids } - tags = local.tags } resource "aws_lambda_function" "send_to_gitc" { @@ -394,16 +397,16 @@ resource "aws_lambda_function" "send_to_gitc" { image_config { command = ["bignbit.send_to_gitc.lambda_handler"] } - function_name = "${local.lambda_resources_name}-send_to_gitc" - role = var.lambda_role.arn + function_name = local.send_to_gitc_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 15 memory_size = 128 environment { variables = { - STACK_NAME = local.lambda_resources_name + STACK_NAME = local.aws_resources_name CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name GIBS_REGION = var.gibs_region GIBS_SQS_URL = "https://sqs.${var.gibs_region}.amazonaws.com/${var.gibs_account_id}/${var.gibs_queue_name}" } @@ -414,7 +417,6 @@ resource "aws_lambda_function" "send_to_gitc" { security_group_ids = var.security_group_ids } - tags = local.tags } @@ -428,16 +430,16 @@ resource "aws_lambda_function" "handle_gitc_response" { image_config { command = ["bignbit.handle_gitc_response.handler"] } - function_name = "${local.lambda_resources_name}-handle_gitc_response" - role = var.lambda_role.arn + function_name = local.handle_gitc_response_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 15 memory_size = 128 environment { variables = { - STACK_NAME = local.lambda_resources_name + STACK_NAME = local.aws_resources_name CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name POBIT_AUDIT_BUCKET_NAME = var.pobit_audit_bucket POBIT_AUDIT_PATH_NAME = var.pobit_audit_path CMR_ENVIRONMENT = local.environment != "OPS" ? "UAT" : "" @@ -451,7 +453,6 @@ resource "aws_lambda_function" "handle_gitc_response" { security_group_ids = var.security_group_ids } - tags = local.tags } resource "aws_lambda_function" "save_cnm_message" { @@ -464,16 +465,16 @@ resource "aws_lambda_function" "save_cnm_message" { image_config { command = ["bignbit.save_cnm_message.lambda_handler"] } - function_name = "${local.lambda_resources_name}-save_cma_message" - role = var.lambda_role.arn + function_name = local.save_cnm_message_function_name + role = aws_iam_role.bignbit_lambda_role.arn timeout = 15 memory_size = 128 environment { variables = { - STACK_NAME = local.lambda_resources_name + STACK_NAME = local.aws_resources_name CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" - REGION = var.region + REGION = data.aws_region.current.name } } @@ -482,132 +483,123 @@ resource "aws_lambda_function" "save_cnm_message" { security_group_ids = var.security_group_ids } - tags = local.tags } -data "aws_iam_policy_document" "gibs_response_topic_policy" { +# Lambda IAM setup below + + +data "aws_iam_policy_document" "bignbit_lambda_assume_role_policy" { statement { - sid = "${local.lambda_resources_name}-grant-gitc-publish-sns" - effect = "Allow" + actions = ["sts:AssumeRole"] principals { - identifiers = compact([ - var.gibs_account_id, - data.aws_caller_identity.current.account_id - ]) - type = "AWS" + type = "Service" + identifiers = ["lambda.amazonaws.com"] } - actions = ["sns:Publish"] - resources = [aws_sns_topic.gibs_response_topic.arn] } } -resource "aws_sns_topic_policy" "default" { - arn = aws_sns_topic.gibs_response_topic.arn - policy = data.aws_iam_policy_document.gibs_response_topic_policy.json +data "aws_ssm_parameter" "ed-user" { + name = var.edl_user_ssm } - -resource "aws_sns_topic" "gibs_response_topic" { - name = "${local.lambda_resources_name}-gibs-response-topic" - tags = local.tags -} - -resource "aws_sqs_queue" "gibs_response_queue" { - name = "${local.lambda_resources_name}-gibs-response-queue" - tags = local.tags - redrive_policy = jsonencode({ - deadLetterTargetArn = aws_sqs_queue.gibs_response_deadletter.arn - maxReceiveCount = 4 - }) +data "aws_ssm_parameter" "ed-pass" { + name = var.edl_pass_ssm } -resource "aws_sqs_queue" "gibs_response_deadletter" { - name = "${local.lambda_resources_name}-gibs-response-dlq" - redrive_allow_policy = jsonencode({ - redrivePermission = "byQueue", - # Cannot use reference to aws_sqs_queue.gibs_response_queue.arn because it causes a cycle https://github.com/hashicorp/terraform-provider-aws/issues/22577 - sourceQueueArns = ["arn:aws:sqs:${var.region}:${local.account_id}:${local.lambda_resources_name}-gibs-response-queue"] - }) +resource "aws_iam_role" "bignbit_lambda_role" { + name = "${local.aws_resources_name}-lambda-role" + assume_role_policy = data.aws_iam_policy_document.bignbit_lambda_assume_role_policy.json + permissions_boundary = var.permissions_boundary_arn } -data "aws_iam_policy_document" "gibs_response_queue_policy" { +data "aws_iam_policy_document" "bignbit_lambda_policy" { statement { - sid = "${local.lambda_resources_name}-grant-topic-send-sqs" - effect = "Allow" - principals { - identifiers = [ - data.aws_caller_identity.current.account_id - ] - type = "AWS" - } - principals { - identifiers = ["sns.amazonaws.com"] - type = "Service" - } - actions = ["sqs:SendMessage"] - resources = [aws_sqs_queue.gibs_response_queue.arn] - condition { - test = "ArnEquals" - values = [aws_sns_topic.gibs_response_topic.arn] - variable = "aws:SourceArn" - } + actions = [ + "ec2:CreateNetworkInterface", + "sns:publish", + "cloudformation:DescribeStacks", + "dynamodb:ListTables", + "ec2:DeleteNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "events:DeleteRule", + "events:DescribeRule", + "events:DisableRule", + "events:EnableRule", + "events:ListRules", + "events:PutRule", + "kinesis:DescribeStream", + "kinesis:GetRecords", + "kinesis:GetShardIterator", + "kinesis:ListStreams", + "kinesis:PutRecord", + "lambda:GetFunction", + "lambda:invokeFunction", + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogStreams", + "logs:PutLogEvents", + "s3:ListAllMyBuckets", + "sns:List*", + "states:DescribeActivity", + "states:DescribeExecution", + "states:GetActivityTask", + "states:GetExecutionHistory", + "states:ListStateMachines", + "states:SendTaskFailure", + "states:SendTaskSuccess", + "states:StartExecution", + "states:StopExecution" + ] + resources = ["*"] } -} -resource "aws_sqs_queue_policy" "gibs_response_queue_policy" { - queue_url = aws_sqs_queue.gibs_response_queue.id - policy = data.aws_iam_policy_document.gibs_response_queue_policy.json -} + statement { + actions = [ + "s3:GetAccelerateConfiguration", + "s3:GetLifecycleConfiguration", + "s3:GetReplicationConfiguration", + "s3:GetBucket*", + "s3:PutAccelerateConfiguration", + "s3:PutLifecycleConfiguration", + "s3:PutReplicationConfiguration", + "s3:PutBucket*", + "s3:ListBucket*", + "s3:AbortMultipartUpload", + "s3:GetObject*", + "s3:PutObject*", + "s3:ListMultipartUploadParts", + "s3:DeleteObject", + "s3:DeleteObjectVersion", + ] + resources = [ + "arn:aws:s3:::${local.harmony_bucket_name}", + "arn:aws:s3:::${var.config_bucket}", + "arn:aws:s3:::${var.pobit_audit_bucket}", + "arn:aws:s3:::${local.harmony_bucket_name}/*", + "arn:aws:s3:::${var.config_bucket}/*", + "arn:aws:s3:::${var.pobit_audit_bucket}/*" -resource "aws_sns_topic_subscription" "gibs_topic_subscription" { - topic_arn = aws_sns_topic.gibs_response_topic.arn - protocol = "sqs" - endpoint = aws_sqs_queue.gibs_response_queue.arn - raw_message_delivery = true -} + !!!!!!also need permission for buckets where data lives!!!!! -data "aws_iam_policy_document" "gibs_response_role_policy" { - statement { - sid = "${replace(title(replace(local.lambda_resources_name, "-", " ")), " ", "")}GrantReadGitcResponse" - effect = "Allow" - actions = ["sqs:GetQueueAttributes", - "sqs:GetQueueUrl", - "sqs:DeleteMessage", - "sqs:ChangeMessageVisibility", - "sqs:PurgeQueue", - "sqs:ReceiveMessage" ] - resources = [aws_sqs_queue.gibs_response_queue.arn] } + statement { - sid = "${replace(title(replace(local.lambda_resources_name, "-", " ")), " ", "")}GrantReadGitcResponse2" - effect = "Allow" - actions = ["sqs:ListQueues"] - resources = ["arn:aws:sqs:*:${local.account_id}:*"] + actions = [ + "ssm:GetParameters", + "ssm:GetParameter" + ] + resources = [ + data.aws_ssm_parameter.ed-user.arn, + data.aws_ssm_parameter.ed-pass.arn + ] } } -resource "aws_iam_role_policy" "allow_lambda_role_to_read_sqs_messages" { - name_prefix = local.lambda_resources_name - role = var.lambda_role.id - policy = data.aws_iam_policy_document.gibs_response_role_policy.json +resource "aws_iam_role_policy" "bignbit_policy_attach" { + name = "${local.aws_resources_name}_bignbit_policy_attach" + role = aws_iam_role.bignbit_lambda_role.id + policy = data.aws_iam_policy_document.bignbit_lambda_policy.json } -resource "aws_lambda_event_source_mapping" "gibs_response_event_trigger" { - event_source_arn = aws_sqs_queue.gibs_response_queue.arn - function_name = aws_lambda_function.handle_gitc_response.arn -} -data "aws_iam_policy_document" "gibs_request_queue_policy" { - statement { - sid = "${replace(title(replace(local.lambda_resources_name, "-", " ")), " ", "")}GrantSendToGitc" - effect = "Allow" - actions = ["sqs:SendMessage"] - resources = ["arn:aws:sqs:*:${var.gibs_account_id}:${var.gibs_queue_name}"] - } -} -resource "aws_iam_role_policy" "allow_lambda_role_to_send_to_gitc" { - name_prefix = local.lambda_resources_name - role = var.lambda_role.id - policy = data.aws_iam_policy_document.gibs_request_queue_policy.json -} diff --git a/terraform/main.tf b/terraform/main.tf index 9df6a79..03409cd 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -2,52 +2,66 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 3.0,!= 3.14.0" + version = ">= 3.9.0" + } + null = { + source = "hashicorp/null" + version = "~> 3" } - null = "~> 2.1" } } -data "aws_caller_identity" "current" {} +provider "aws" { + region = "us-west-2" + ignore_tags { + key_prefixes = ["gsfc-ngap"] + } -data "template_file" "workflow_definition" { - template = file("${path.module}/state_machine_definition.tpl") - vars = { - GetDatasetConfigurationLambda = aws_lambda_function.get_dataset_configuration.arn, - ConfigBucket = var.config_bucket, - ConfigDir = var.config_dir, - GetGranuleUmmJsonLambda = aws_lambda_function.get_granule_umm_json.arn, - IdentifyImageFileLambda = aws_lambda_function.identify_image_file.arn, - ApplyOperaHLSTreatmentLambda = aws_lambda_function.apply_opera_hls_treatment.arn, - GetCollectionConceptIdLambda = aws_lambda_function.get_collection_concept_id.arn, - SubmitHarmonyJobLambda = aws_lambda_function.submit_harmony_job.arn, - GetHarmonyJobStatusLambda = aws_lambda_function.get_harmony_job_status.arn, - CopyHarmonyOutputToS3Lambda = aws_lambda_function.copy_harmony_output_to_s3.arn, - GenerateImageMetadataLambda = aws_lambda_function.generate_image_metadata.arn, - BuildImageSetsLambda = aws_lambda_function.build_image_sets.arn, - SendToGITCLambda = aws_lambda_function.send_to_gitc.arn, - SaveCNMMessageLambda = aws_lambda_function.save_cnm_message.arn, - PobitAuditBucket = var.pobit_audit_bucket, - PobitAuditPath = var.pobit_audit_path + default_tags { + tags = local.default_tags } } +data "aws_caller_identity" "current" {} +data "aws_region" "current" {} + +# +# data "template_file" "workflow_definition" { +# template = file("${path.module}/state_machine_definition.tpl") +# vars = { +# GetDatasetConfigurationLambda = aws_lambda_function.get_dataset_configuration.arn, +# ConfigBucket = var.config_bucket, +# ConfigDir = var.config_dir, +# GetGranuleUmmJsonLambda = aws_lambda_function.get_granule_umm_json.arn, +# IdentifyImageFileLambda = aws_lambda_function.identify_image_file.arn, +# ApplyOperaHLSTreatmentLambda = aws_lambda_function.apply_opera_hls_treatment.arn, +# GetCollectionConceptIdLambda = aws_lambda_function.get_collection_concept_id.arn, +# SubmitHarmonyJobLambda = aws_lambda_function.submit_harmony_job.arn, +# GetHarmonyJobStatusLambda = aws_lambda_function.get_harmony_job_status.arn, +# GenerateImageMetadataLambda = aws_lambda_function.generate_image_metadata.arn, +# BuildImageSetsLambda = aws_lambda_function.build_image_sets.arn, +# SendToGITCLambda = aws_lambda_function.send_to_gitc.arn, +# SaveCNMMessageLambda = aws_lambda_function.save_cnm_message.arn, +# PobitAuditBucket = var.pobit_audit_bucket, +# PobitAuditPath = var.pobit_audit_path, +# HarmonyStagingBucket = var.harmony_staging_bucket, +# HarmonyStagingPath = var.harmony_staging_path +# } +# } -locals { -name = var.app_name -environment = var.stage -account_id = data.aws_caller_identity.current.account_id +locals { + environment = var.stage -lambda_resources_name = terraform.workspace == "default" ? "svc-${local.name}-${local.environment}" : "svc-${local.name}-${local.environment}-${terraform.workspace}" + account_id = data.aws_caller_identity.current.account_id -ec2_resources_name = terraform.workspace == "default" ? "svc-${local.environment}-${local.name}" : "svc-${local.environment}-${local.name}-${terraform.workspace}" + aws_resources_name = terraform.workspace == "default" ? "svc-${var.app_name}-${var.prefix}" : "svc-${var.app_name}-${var.prefix}-${terraform.workspace}" -tags = length(var.default_tags) == 0 ? { -team : "PODAAC TVA", -application : local.lambda_resources_name, -Environment = var.stage -} : var.default_tags + default_tags = length(var.default_tags) == 0 ? { + team : "TVA", + application : var.app_name, + Environment = var.stage + } : var.default_tags } diff --git a/terraform/outputs.tf b/terraform/outputs.tf index dc89d6b..1599f39 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -58,8 +58,8 @@ output "get_harmony_job_status_arn" { value = aws_lambda_function.get_harmony_job_status.arn } -output "copy_harmony_output_to_s3_arn"{ - value = aws_lambda_function.copy_harmony_output_to_s3.arn +output "process_harmony_results_arn" { + value = aws_lambda_function.process_harmony_results.arn } output "apply_opera_hls_treatment_arn"{ @@ -79,5 +79,32 @@ output "pobit_save_cnm_message_arn" { } output "workflow_definition" { - value = data.template_file.workflow_definition.rendered + value = templatefile("${path.module}/state_machine_definition.tpl", { + GetDatasetConfigurationLambda = aws_lambda_function.get_dataset_configuration.arn, + ConfigBucket = var.config_bucket, + ConfigDir = var.config_dir, + GetGranuleUmmJsonLambda = aws_lambda_function.get_granule_umm_json.arn, + IdentifyImageFileLambda = aws_lambda_function.identify_image_file.arn, + ApplyOperaHLSTreatmentLambda = aws_lambda_function.apply_opera_hls_treatment.arn, + GetCollectionConceptIdLambda = aws_lambda_function.get_collection_concept_id.arn, + SubmitHarmonyJobLambda = aws_lambda_function.submit_harmony_job.arn, + GetHarmonyJobStatusLambda = aws_lambda_function.get_harmony_job_status.arn, + ProcessHarmonyJobOutputLambda = aws_lambda_function.process_harmony_results.arn, + GenerateImageMetadataLambda = aws_lambda_function.generate_image_metadata.arn, + BuildImageSetsLambda = aws_lambda_function.build_image_sets.arn, + SendToGITCLambda = aws_lambda_function.send_to_gitc.arn, + SaveCNMMessageLambda = aws_lambda_function.save_cnm_message.arn, + PobitAuditBucket = var.pobit_audit_bucket, + PobitAuditPath = var.pobit_audit_path, + HarmonyStagingBucket = local.harmony_bucket_name, + HarmonyStagingPath = var.harmony_staging_path + }) +} + +output "harmony_staging_bucket" { + value = local.harmony_bucket_name +} + +output "harmony_staging_path" { + value = var.harmony_staging_path } \ No newline at end of file diff --git a/terraform/s3.tf b/terraform/s3.tf new file mode 100644 index 0000000..417a2c1 --- /dev/null +++ b/terraform/s3.tf @@ -0,0 +1,123 @@ +# Create a bucket to store harmony results in unless one is provided as a variable +locals { + create_bucket = var.harmony_staging_bucket == "" + harmony_bucket_name = local.create_bucket ? aws_s3_bucket.harmony_staging_bucket[0].id : var.harmony_staging_bucket +} + +resource "aws_s3_bucket" "harmony_staging_bucket" { + count = local.create_bucket ? 1 : 0 + bucket = "${local.aws_resources_name}-harmony-staging" + + lifecycle { + ignore_changes = [ + lifecycle_rule + ] + } +} + +resource "aws_s3_bucket_ownership_controls" "disable_acls" { + count = local.create_bucket ? 1 : 0 + bucket = aws_s3_bucket.harmony_staging_bucket[0].id + + rule { + object_ownership = "BucketOwnerEnforced" + } +} + +resource "aws_s3_bucket_server_side_encryption_configuration" "enable_bucket_encryption" { + count = local.create_bucket ? 1 : 0 + bucket = aws_s3_bucket.harmony_staging_bucket[0].id + + rule { + bucket_key_enabled = true + + apply_server_side_encryption_by_default { + sse_algorithm = "AES256" + } + } +} + +resource "aws_s3_bucket_lifecycle_configuration" "expire_objects_30_days" { + count = local.create_bucket ? 1 : 0 + bucket = aws_s3_bucket.harmony_staging_bucket[0].id + + rule { + id = "ExpireHarmonyObjectsAfter30Days" + status = "Enabled" + expiration { + days = 30 + } + filter { + prefix = var.harmony_staging_path + } + } +} + +resource "aws_s3_bucket_policy" "harmony_staging_bucket_policy" { + count = local.create_bucket ? 1 : 0 + bucket = aws_s3_bucket.harmony_staging_bucket[0].id + policy = data.aws_iam_policy_document.harmony_staging_bucket_policy[0].json +} + +data "aws_iam_policy_document" "allow_harmony_write" { + count = local.create_bucket ? 1 : 0 + statement { + sid = "write permission" + effect = "Allow" + actions = [ + "s3:PutObject", + ] + resources = [ + "${aws_s3_bucket.harmony_staging_bucket[0].arn}/${var.harmony_staging_path}/*" + ] + principals { + identifiers = ["arn:aws:iam::549360732797:root", "arn:aws:iam::625642860590:root"] + type = "AWS" + } + } +} + +data "aws_iam_policy_document" "allow_harmony_location" { + count = local.create_bucket ? 1 : 0 + statement { + sid = "get bucket location permission" + effect = "Allow" + actions = [ + "s3:GetBucketLocation", + ] + resources = [ + aws_s3_bucket.harmony_staging_bucket[0].arn + ] + principals { + identifiers = ["arn:aws:iam::549360732797:root", "arn:aws:iam::625642860590:root"] + type = "AWS" + } + } +} + +data "aws_iam_policy_document" "allow_gibs_getobject" { + count = local.create_bucket ? 1 : 0 + statement { + sid = "gibs get object" + effect = "Allow" + actions = [ + "s3:GetObject*", + ] + resources = [ + "${aws_s3_bucket.harmony_staging_bucket[0].arn}/${var.harmony_staging_path}/*" + ] + principals { + identifiers = ["arn:aws:iam::${var.gibs_account_id}:root"] + type = "AWS" + } + } +} + +data "aws_iam_policy_document" "harmony_staging_bucket_policy" { + count = local.create_bucket ? 1 : 0 + source_policy_documents = [ + data.aws_iam_policy_document.allow_harmony_write[0].json, + data.aws_iam_policy_document.allow_harmony_location[0].json, + data.aws_iam_policy_document.allow_gibs_getobject[0].json + ] +} \ No newline at end of file diff --git a/terraform/sqs_sns.tf b/terraform/sqs_sns.tf new file mode 100644 index 0000000..a06f925 --- /dev/null +++ b/terraform/sqs_sns.tf @@ -0,0 +1,142 @@ + +data "aws_iam_policy_document" "gibs_response_topic_policy" { + statement { + sid = "${local.aws_resources_name}-grant-gitc-publish-sns" + effect = "Allow" + principals { + identifiers = compact([ + var.gibs_account_id, + data.aws_caller_identity.current.account_id + ]) + type = "AWS" + } + actions = ["sns:Publish"] + resources = [aws_sns_topic.gibs_response_topic.arn] + } +} + +resource "aws_sns_topic_policy" "default" { + arn = aws_sns_topic.gibs_response_topic.arn + policy = data.aws_iam_policy_document.gibs_response_topic_policy.json +} + +resource "aws_sns_topic" "gibs_response_topic" { + name = "${local.aws_resources_name}-gibs-response-topic" + lifecycle { + # GIBS publishes to this topic, so we want to avoid destroying it unless coordinating the change with GIBS + # prevent_destroy = true + } +} + +resource "aws_sqs_queue" "gibs_response_queue" { + name = "${local.aws_resources_name}-gibs-response-queue" + redrive_policy = jsonencode({ + deadLetterTargetArn = aws_sqs_queue.gibs_response_deadletter.arn + maxReceiveCount = 4 + }) +} + +resource "aws_sqs_queue" "gibs_response_deadletter" { + name = "${local.aws_resources_name}-gibs-response-dlq" + redrive_allow_policy = jsonencode({ + redrivePermission = "byQueue", + # Cannot use reference to aws_sqs_queue.gibs_response_queue.arn because it causes a cycle https://github.com/hashicorp/terraform-provider-aws/issues/22577 + sourceQueueArns = ["arn:aws:sqs:${data.aws_region.current.name}:${local.account_id}:${local.aws_resources_name}-gibs-response-queue"] + }) +} + +data "aws_iam_policy_document" "gibs_response_queue_policy" { + statement { + sid = "${local.aws_resources_name}-grant-topic-send-sqs" + effect = "Allow" + principals { + identifiers = [ + data.aws_caller_identity.current.account_id + ] + type = "AWS" + } + principals { + identifiers = ["sns.amazonaws.com"] + type = "Service" + } + actions = ["sqs:SendMessage"] + resources = [aws_sqs_queue.gibs_response_queue.arn] + condition { + test = "ArnEquals" + values = [aws_sns_topic.gibs_response_topic.arn] + variable = "aws:SourceArn" + } + } +} + +resource "aws_sqs_queue_policy" "gibs_response_queue_policy" { + queue_url = aws_sqs_queue.gibs_response_queue.id + policy = data.aws_iam_policy_document.gibs_response_queue_policy.json +} + +resource "aws_sns_topic_subscription" "gibs_topic_subscription" { + topic_arn = aws_sns_topic.gibs_response_topic.arn + protocol = "sqs" + endpoint = aws_sqs_queue.gibs_response_queue.arn + raw_message_delivery = true +} + +data "aws_iam_policy_document" "gibs_response_role_policy" { + statement { + sid = "${replace(title(replace(local.aws_resources_name, "-", " ")), " ", "")}GrantReadGitcResponse" + effect = "Allow" + actions = ["sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + "sqs:DeleteMessage", + "sqs:ChangeMessageVisibility", + "sqs:PurgeQueue", + "sqs:ReceiveMessage" + ] + resources = [aws_sqs_queue.gibs_response_queue.arn] + } + statement { + sid = "${replace(title(replace(local.aws_resources_name, "-", " ")), " ", "")}GrantReadGitcResponse2" + effect = "Allow" + actions = ["sqs:ListQueues"] + resources = ["arn:aws:sqs:*:${local.account_id}:*"] + } +} + +resource "aws_iam_role_policy" "allow_lambda_role_to_read_sqs_messages" { + name_prefix = local.aws_resources_name + role = aws_iam_role.bignbit_lambda_role.id + policy = data.aws_iam_policy_document.gibs_response_role_policy.json +} + +resource "aws_lambda_event_source_mapping" "gibs_response_event_trigger" { + event_source_arn = aws_sqs_queue.gibs_response_queue.arn + function_name = aws_lambda_function.handle_gitc_response.arn +} + +data "aws_iam_policy_document" "gibs_request_queue_policy" { + statement { + sid = "${replace(title(replace(local.aws_resources_name, "-", " ")), " ", "")}GrantSendToGitc" + effect = "Allow" + actions = ["sqs:SendMessage"] + resources = ["arn:aws:sqs:*:${var.gibs_account_id}:${var.gibs_queue_name}"] + } + + statement { + actions = [ + "sqs:SendMessage", + "sqs:ReceiveMessage", + "sqs:ChangeMessageVisibility", + "sqs:DeleteMessage", + "sqs:GetQueueUrl", + "sqs:GetQueueAttributes", + ] + resources = ["arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:*", + "arn:aws:sqs:${var.gibs_region}:${var.gibs_account_id}:${var.gibs_queue_name}"] + } +} + +resource "aws_iam_role_policy" "allow_lambda_role_to_send_to_gitc" { + name_prefix = local.aws_resources_name + role = aws_iam_role.bignbit_lambda_role.id + policy = data.aws_iam_policy_document.gibs_request_queue_policy.json +} diff --git a/terraform/state_machine_definition.tpl b/terraform/state_machine_definition.tpl index 42a3d25..3513a58 100644 --- a/terraform/state_machine_definition.tpl +++ b/terraform/state_machine_definition.tpl @@ -236,7 +236,6 @@ "Type":"Map", "ItemsPath":"$.payload.datasetConfigurationForBIG.config.imgVariables", "ItemSelector":{ - "cumulus_meta.$":"$.cumulus_meta", "meta.$":"$.meta", "payload.$":"$.payload", "task_config.$":"$.task_config", @@ -261,6 +260,8 @@ "cmr_environment":"{$.meta.cmr.cmrEnvironment}", "cmr_clientid":"{$.meta.cmr.clientId}", "current_item":"{$.current_item}", + "harmony_staging_bucket": "${HarmonyStagingBucket}", + "harmony_staging_path": "${HarmonyStagingPath}", "big_config":"{$.payload.datasetConfigurationForBIG}", "cumulus_message":{ "input":"{$.payload}" @@ -320,7 +321,7 @@ { "Variable":"$.payload.harmony_job_status", "StringMatches":"successful", - "Next":"Job Successful", + "Next":"Process Harmony Job Output", "Comment":"Job successful" }, { @@ -344,8 +345,45 @@ ], "Default":"Wait 20 Seconds" }, - "Job Successful":{ - "Type":"Succeed" + "Process Harmony Job Output":{ + "Type":"Task", + "Resource":"${ProcessHarmonyJobOutputLambda}", + "OutputPath": "$.payload", + "Parameters":{ + "cma":{ + "event.$":"$", + "task_config":{ + "cmr_environment":"{$.meta.cmr.cmrEnvironment}", + "harmony_job":"{$.payload.harmony_job.job}", + "variable":"{$.current_item.id}", + "cumulus_message":{ + "input":"{$.payload}" + } + } + } + }, + "Retry":[ + { + "ErrorEquals":[ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds":2, + "MaxAttempts":6, + "BackoffRate":2 + }, + { + "ErrorEquals": [ + "Lambda.Unknown" + ], + "BackoffRate": 2, + "IntervalSeconds": 2, + "MaxAttempts": 2 + } + ], + "End":true }, "Fail":{ "Type":"Fail" @@ -396,7 +434,6 @@ "Type":"Pass", "Next":"BuildImageSets", "Parameters":{ - "cumulus_meta.$": "$.cumulus_meta", "meta": { "buckets.$": "$.meta.buckets", "cmr.$": "$.meta.cmr", @@ -408,8 +445,7 @@ "granules.$":"$.payload.granules", "big.$":"$.payload.big" }, - "exception.$":"$.exception", - "task_config.$":"$.task_config" + "exception.$":"$.exception" }, "Comment":"Removes extra data from payload that is no longer necessary" }, diff --git a/terraform/variables.tf b/terraform/variables.tf index 0706e87..5ed4670 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -1,23 +1,21 @@ -variable "aws_profile" { - type = string - default = null -} - variable "stage" { type = string + description = "Environment used for resource tagging (dev, int, ops, etc...)" } variable "prefix" { type = string + description = "Prefix used for resource naming (project name, env name, etc...)" } -# The location of dataset-config file. Ex. s3://my-internal/datset-config/ variable "config_bucket" { type = string + description = "Bucket where dataset configuration is stored" } variable "config_dir" { type = string + description = "Path relative to config_bucket where dataset configuration is stored" default = "datset-config" } @@ -32,31 +30,46 @@ variable "pobit_audit_path" { default = "pobit-cma-output" } +variable "harmony_staging_bucket" { + type = string + description = "S3 bucket where Harmony results will be saved. Leave blank to use bucket managed by this module." + default = "" +} + +variable "harmony_staging_path" { + type = string + description = "Path relative to harmony_staging_bucket where harmony results will be saved." + default = "bignbit-harmony-output" +} + variable "gibs_region" { type = string + description = "Region where GIBS resources are deployed" } variable "gibs_queue_name" { type = string + description = "Name of the GIBS SQS queue where outgoing CNM messages will be sent" } variable "gibs_account_id" { type = string + description = "AWS account ID for GIBS" } variable "edl_user_ssm" { type = string + description = "Name of SSM parameter containing EDL username for querying CMR" } variable "edl_pass_ssm" { type = string + description = "Name of SSM parameter containing EDL password for querying CMR" } -variable "lambda_role" { - type = object({ - id = string - arn = string - }) +variable "permissions_boundary_arn" { + type = string + description = "Permissions boundary ARN to apply to the roles created by this module. If not provided, no permissions boundary will be applied." } variable "security_group_ids" { @@ -67,12 +80,8 @@ variable "subnet_ids" { type = list(string) } -variable "region" { - type = string -} - variable "app_name" { - default = "big" + default = "bignbit" } variable "default_tags" { @@ -80,18 +89,6 @@ variable "default_tags" { default = {} } -variable task_logs_retention_in_days{ - description = "Log retention days" - type = number - default = 30 -} - -variable tags{ - description = "tags" - type = map(string) - default = {} -} - variable "lambda_container_image_uri" { type = string default = "" diff --git a/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json b/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json index c0e4032..fe12e84 100644 --- a/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json +++ b/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json @@ -2,20 +2,24 @@ "meta": { "buckets": { "internal": { - "name": "svc-uat-big-internal", + "name": "podaac-uat-svc-internal", "type": "internal" }, "private": { - "name": "svc-uat-big-private", + "name": "podaac-uat-svc-private", "type": "private" }, "protected": { - "name": "svc-uat-big-protected", + "name": "podaac-uat-svc-protected", "type": "protected" }, "public": { - "name": "svc-uat-big-public", + "name": "podaac-uat-svc-public", "type": "public" + }, + "staging": { + "name": "podaac-uat-svc-staging", + "type": "internal" } }, "cmr": { @@ -40,10 +44,10 @@ "dataType": "MUR-JPL-L4-GLOB-v4.1", "files": [ { - "bucket": "svc-uat-big-protected", + "bucket": "podaac-uat-svc-protected", "checksum": "412a8833fb314df802f987b629670feb", "checksumType": "md5", - "fileName": "s3://podaac-uat-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc", + "fileName": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc", "key": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc", "filepath": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc", "name": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc", @@ -53,10 +57,10 @@ "url_path": "{cmrMetadata.CollectionReference.ShortName}" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "checksum": "ba0b513b1395fa782a7e4f4b75976430", "checksumType": "md5", - "fileName": "s3://podaac-uat-cumulus-public/MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5", + "fileName": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5", "key": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5", "filepath": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5", "name": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5", @@ -66,9 +70,8 @@ "url_path": "{cmrMetadata.CollectionReference.ShortName}" }, { - "bucket": "podaac-uat-cumulus-public", - "etag": "\"ae169607ae91866b8fc7644395105a15\"", - "fileName": "s3://podaac-uat-cumulus-public/MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.cmr.json", + "bucket": "podaac-uat-svc-public", + "fileName": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.cmr.json", "key": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.cmr.json", "filepath": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.cmr.json", "name": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.cmr.json", @@ -77,8 +80,8 @@ "url_path": "{cmrMetadata.CollectionReference.ShortName}" }, { - "bucket": "podaac-uat-cumulus-protected", - "fileName": "s3://podaac-uat-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.dmrpp", + "bucket": "podaac-uat-svc-protected", + "fileName": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.dmrpp", "key": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.dmrpp", "filepath": "MUR-JPL-L4-GLOB-v4.1/20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.dmrpp", "name": "20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.dmrpp", diff --git a/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json index 2c95bc0..7fbb981 100644 --- a/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json +++ b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json @@ -1,48 +1,24 @@ { "meta": { "buckets": { - "documentation": { - "name": "podaac-uat-cumulus-docs", - "type": "public" - }, - "ecco-staging": { - "name": "podaac-ecco-v4r4", - "type": "internal" - }, - "glacier": { - "name": "podaac-uat-cumulus-glacier", - "type": "orca" - }, "internal": { - "name": "svc-uat-big-internal", - "type": "internal" - }, - "opera-dev-rs-fwd": { - "name": "opera-dev-rs-fwd*", - "type": "internal" - }, - "opera-int-rs-fwd": { - "name": "opera-int-rs-fwd*", - "type": "internal" - }, - "podaac-dev": { - "name": "podaac-dev-*", + "name": "podaac-uat-svc-internal", "type": "internal" }, "private": { - "name": "svc-uat-big-private", + "name": "podaac-uat-svc-private", "type": "private" }, "protected": { - "name": "svc-uat-big-protected", + "name": "podaac-uat-svc-protected", "type": "protected" }, "public": { - "name": "svc-uat-big-public", + "name": "podaac-uat-svc-public", "type": "public" }, "staging": { - "name": "svc-uat-big-staging", + "name": "podaac-uat-svc-staging", "type": "internal" } }, @@ -55,191 +31,8 @@ "username": "podaaccumulus" }, "collection": { - "createdAt": 1675991668650, - "updatedAt": 1676017294040, "name": "OPERA_L3_DSWX-HLS_V1.0", - "version": "1.0", - "url_path": "{cmrMetadata.CollectionReference.ShortName}", - "duplicateHandling": "replace", - "granuleId": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*$", - "granuleIdExtraction": "^(OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*)((_.*_.*\\.tif)|(.*\\.md5)|(\\.context\\.json)|(\\.dataset\\.json)|(\\.cmr\\.json)|(\\.log)|(\\.catalog\\.json)|(\\.iso\\.xml)|(\\.png)|(BROWSE\\.tif)|(\\.met\\.json)|(\\.rc\\.yaml))?$", - "files": [ - { - "type": "data", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*_.*_.*\\.tif$", - "bucket": "protected", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0__.tif" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.context\\.json$", - "bucket": "public", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.context.json" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.dataset\\.json$", - "bucket": "public", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.dataset.json" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.cmr\\.json$", - "bucket": "private", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.cmr.json" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.log$", - "bucket": "private", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.log" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.catalog\\.json$", - "bucket": "private", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.catalog.json" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.iso\\.xml$", - "bucket": "public", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.iso.xml" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.png$", - "bucket": "protected", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.png" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*BROWSE\\.tif$", - "bucket": "private", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0BROWSE.tif" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.met\\.json$", - "bucket": "public", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.met.json" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.rc\\.yaml$", - "bucket": "public", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.rc.yaml" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*_.*_.*\\.tif\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*_.*_.*\\.tif$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0__.tif.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.context\\.json\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.context\\.json$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.context.json.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.dataset\\.json\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.dataset\\.json$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.dataset.json.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.log\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.log$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.log.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.catalog\\.json\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.catalog\\.json$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.catalog.json.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.iso\\.xml\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.iso\\.xml$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.iso.xml.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.png\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.png$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.png.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*BROWSE\\.tif\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*BROWSE\\.tif$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0BROWSE.tif.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.met\\.json\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.met\\.json$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.met.json.md5" - }, - { - "type": "metadata", - "regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.rc\\.yaml\\.md5$", - "bucket": "public", - "checksumFor": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.rc\\.yaml$", - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0.rc.yaml.md5" - } - ], - "reportToEms": true, - "sampleFileName": "OPERA_L3_DSWx-HLS_LANDSAT-8_T22VEQ_20210905T143156_v1.0__.tif", - "meta": { - "iso-regex": "^OPERA_L3_DSWx-HLS_.*v([0-9]*)\\.([0-9]*).*\\.iso\\.xml$", - "glacier-bucket": "podaac-uat-cumulus-glacier", - "workflowChoice": { - "dmrpp": false, - "glacier": false, - "compressed": false, - "convertNetCDF": false, - "readDataFileForMetadata": false - }, - "response-endpoint": [ - "arn:aws:sns:us-west-2:123456789012:podaac-uat-cumulus-provider-response-sns" - ], - "granuleRecoveryWorkflow": "OrcaRecoveryWorkflow", - "granuleMetadataFileExtension": "cmr.json" - } + "version": "1.0" } }, "payload": { @@ -251,7 +44,7 @@ "sync_granule_duration": 2055, "files": [ { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B01_WTR.tif", "size": 247009, "checksumType": "md5", @@ -261,7 +54,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B01_WTR.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B02_BWTR.tif", "size": 244564, "checksumType": "md5", @@ -271,7 +64,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B02_BWTR.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B03_CONF.tif", "size": 252298, "checksumType": "md5", @@ -281,7 +74,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B03_CONF.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B04_DIAG.tif", "size": 2039842, "checksumType": "md5", @@ -291,7 +84,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B04_DIAG.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B05_WTR-1.tif", "size": 1168161, "checksumType": "md5", @@ -301,7 +94,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B05_WTR-1.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B06_WTR-2.tif", "size": 983771, "checksumType": "md5", @@ -311,7 +104,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B06_WTR-2.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B07_LAND.tif", "size": 752053, "checksumType": "md5", @@ -321,7 +114,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B07_LAND.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B08_SHAD.tif", "size": 1373226, "checksumType": "md5", @@ -331,7 +124,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B08_SHAD.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B09_CLOUD.tif", "size": 456847, "checksumType": "md5", @@ -341,7 +134,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B09_CLOUD.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B10_DEM.tif", "size": 34081413, "checksumType": "md5", @@ -351,7 +144,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B10_DEM.tif" }, { - "bucket": "svc-uat-big-private", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_BROWSE.tif", "size": 246919, "checksumType": "md5", @@ -361,7 +154,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_BROWSE.tif" }, { - "bucket": "podaac-uat-cumulus-protected", + "bucket": "podaac-uat-svc-protected", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_BROWSE.png", "size": 30588, "checksumType": "md5", @@ -371,7 +164,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_BROWSE.png" }, { - "bucket": "podaac-uat-cumulus-private", + "bucket": "podaac-uat-svc-private", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.log", "size": 38455, "checksumType": "md5", @@ -381,7 +174,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.log" }, { - "bucket": "podaac-uat-cumulus-private", + "bucket": "podaac-uat-svc-private", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.catalog.json", "size": 2585, "checksumType": "md5", @@ -391,7 +184,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.catalog.json" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.iso.xml", "size": 77014, "checksumType": "md5", @@ -401,7 +194,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.iso.xml" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B01_WTR.tif.md5", "size": 32, "checksumType": "md5", @@ -411,7 +204,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B01_WTR.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B02_BWTR.tif.md5", "size": 32, "checksumType": "md5", @@ -421,7 +214,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B02_BWTR.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B03_CONF.tif.md5", "size": 32, "checksumType": "md5", @@ -431,7 +224,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B03_CONF.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B04_DIAG.tif.md5", "size": 32, "checksumType": "md5", @@ -441,7 +234,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B04_DIAG.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B05_WTR-1.tif.md5", "size": 32, "checksumType": "md5", @@ -451,7 +244,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B05_WTR-1.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B06_WTR-2.tif.md5", "size": 32, "checksumType": "md5", @@ -461,7 +254,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B06_WTR-2.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B07_LAND.tif.md5", "size": 32, "checksumType": "md5", @@ -471,7 +264,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B07_LAND.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B08_SHAD.tif.md5", "size": 32, "checksumType": "md5", @@ -481,7 +274,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B08_SHAD.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B09_CLOUD.tif.md5", "size": 32, "checksumType": "md5", @@ -491,7 +284,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B09_CLOUD.tif.md5" }, { - "bucket": "podaac-uat-cumulus-public", + "bucket": "podaac-uat-svc-public", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B10_DEM.tif.md5", "size": 32, "checksumType": "md5", @@ -501,7 +294,7 @@ "key": "OPERA_L3_DSWX-HLS_V1.0/OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0_B10_DEM.tif.md5" }, { - "bucket": "podaac-uat-cumulus-private", + "bucket": "podaac-uat-svc-private", "fileName": "OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.cmr.json", "size": 7965, "type": "metadata", @@ -516,30 +309,5 @@ "post_to_cmr_duration": 427 } ] - }, - "task_config": { - "OriginalCNM": "{$.meta.cnm}", - "distribution_endpoint": "{$.meta.distribution_endpoint}", - "type": "sns", - "response-endpoint": "{$.meta.collection.meta.response-endpoint}", - "region": "us-west-2", - "WorkflowException": "{$.exception}", - "cumulus_message": { - "outputs": [ - { - "source": "{$.cnm}", - "destination": "{$.meta.granule.queryFields.cnm}" - }, - { - "source": "{$.cnm}", - "destination": "{$.meta.cnmResponse}" - }, - { - "source": "{$.input.input}", - "destination": "{$.payload}" - } - ] - } - }, - "exception": "None" + } } \ No newline at end of file diff --git a/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.json b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.json new file mode 100644 index 0000000..37faf9a --- /dev/null +++ b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.json @@ -0,0 +1,206 @@ +{ + "meta": { + "provider": {}, + "stack": {}, + "buckets": { + "internal": { + "name": "podaac-uat-svc-internal", + "type": "internal" + }, + "private": { + "name": "podaac-uat-svc-private", + "type": "private" + }, + "protected": { + "name": "podaac-uat-svc-protected", + "type": "protected" + }, + "public": { + "name": "podaac-uat-svc-public", + "type": "public" + }, + "staging": { + "name": "podaac-uat-svc-staging", + "type": "internal" + } + }, + "cmr": { + "clientId": "POCLOUD", + "cmrEnvironment": "UAT", + "cmrLimit": 100, + "cmrPageSize": 50, + "provider": "POCLOUD", + "username": "podaaccumulus" + }, + "collection": { + "name": "OPERA_L3_DSWX-S1_V1", + "version": "1.0" + } + }, + "payload": { + "granules": [ + { + "createdAt": 1733518237281, + "granuleId": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0", + "provider": "opera", + "dataType": "OPERA_L3_DSWX-S1_V1", + "sync_granule_duration": 1166, + "files": [ + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png", + "size": 5754, + "checksumType": "md5", + "checksum": "c5b4bd0cfe478279a9825a4edf53c61b", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png", + "type": "browse", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png" + }, + { + "bucket": "podaac-uat-svc-protected", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif", + "size": 99968, + "checksumType": "md5", + "checksum": "efeef830e479cc8747fcd038330a6f6e", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif", + "type": "data", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif" + }, + { + "bucket": "podaac-uat-svc-protected", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif", + "size": 98425, + "checksumType": "md5", + "checksum": "94e8c1386194303fb4c3d4fbf17d3bde", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif", + "type": "data", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif" + }, + { + "bucket": "podaac-uat-svc-protected", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif", + "size": 107257, + "checksumType": "md5", + "checksum": "2be28883d0b24890f7c33f4a008dcf9e", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif", + "type": "data", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif" + }, + { + "bucket": "podaac-uat-svc-protected", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif", + "size": 216605, + "checksumType": "md5", + "checksum": "3ecf23ac688360aade60acacb130951d", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif", + "type": "data", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml", + "size": 333986, + "checksumType": "md5", + "checksum": "f2a06932b0ad066073c822396518be09", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml.md5", + "size": 32, + "checksumType": "md5", + "checksum": "ee3d1e52012634d8a3982c57f1cc7e03", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.iso.xml.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif.md5", + "size": 32, + "checksumType": "md5", + "checksum": "7cd1bf39eba2ec55f9d73ee60dc388e9", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B01_WTR.tif.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif.md5", + "size": 32, + "checksumType": "md5", + "checksum": "ade3ebb43db5d1ab3bbe8ae25181dc36", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B02_BWTR.tif.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif.md5", + "size": 32, + "checksumType": "md5", + "checksum": "a76fc9be71b41c4b530caa6bfa620c2a", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B03_CONF.tif.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif.md5", + "size": 32, + "checksumType": "md5", + "checksum": "e69c48c1ef3fce0e81b1d9c9dcf5f9ac", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_B04_DIAG.tif.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png.md5", + "size": 32, + "checksumType": "md5", + "checksum": "409faa73732f46d7c495ccff34ddf2ed", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.png.md5" + }, + { + "bucket": "podaac-uat-svc-public", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif.md5", + "size": 32, + "checksumType": "md5", + "checksum": "da3ae2b44cd75152fd21fe4b628a1554", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif.md5", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif.md5" + }, + { + "bucket": "podaac-uat-svc-protected", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif", + "size": 93686, + "checksumType": "md5", + "checksum": "c1d839cf2b6477f96dced66494fb76e4", + "source": "products/DSWx_S1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif", + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0_BROWSE.tif" + }, + { + "bucket": "podaac-uat-cumulus-private", + "fileName": "OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.cmr.json", + "size": 27303, + "type": "metadata", + "key": "OPERA_L3_DSWX-S1_V1/OPERA_L3_DSWx-S1_T45QYD_20241001T121219Z_20241206T065726Z_S1A_30_v1.0.cmr.json" + } + ], + "version": "1.0", + "cmrLink": "https://cmr.uat.earthdata.nasa.gov/search/concepts/G1272632541-POCLOUD.umm_json", + "cmrConceptId": "G1272632541-POCLOUD", + "published": true, + "cmrMetadataFormat": "umm_json_v1_6_6", + "post_to_cmr_duration": 573 + } + ] + } +} \ No newline at end of file From 2f6fc1a30d5fb8aa11401399a27c80fc25b00d56 Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Mon, 16 Dec 2024 08:44:17 -0800 Subject: [PATCH 12/16] Update to place harmony results in our bucket --- README.md | 1 + examples/cumulus-tf/browse_image_workflow.tf | 2 + terraform/lambda_functions.tf | 78 ++++++++++++------- terraform/variables.tf | 6 ++ ...4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json | 2 + ...2T034350Z_20230131T222341Z_L8_30_v0.0.json | 2 + 6 files changed, 64 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 7d1f1e8..28572b1 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ This module uses the following input variables: |----------------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| | stage | string | Environment used for resource tagging (dev, int, ops, etc...) | | | prefix | string | Prefix used for resource naming (project name, env name, etc...) | | +| data_buckets | list(string) | List of buckets where data is stored. Lambdas will be given read/write access to these buckets. | [] | | config_bucket | string | Bucket where dataset configuration is stored | | | config_dir | string | Path relative to `config_bucket` where dataset configuration is stored | "datset-config" | | pobit_audit_bucket | string | S3 bucket where messages exchanged with GITC will be saved. Typically the cumulus internal bucket | | diff --git a/examples/cumulus-tf/browse_image_workflow.tf b/examples/cumulus-tf/browse_image_workflow.tf index 0d5dfed..91f0513 100644 --- a/examples/cumulus-tf/browse_image_workflow.tf +++ b/examples/cumulus-tf/browse_image_workflow.tf @@ -8,6 +8,8 @@ module "bignbit_module" { stage = var.bignbit_stage prefix = var.prefix + data_buckets = [aws_s3_bucket.protected.id, aws_s3_bucket.public.id, aws_s3_bucket.private.id] + config_bucket = aws_s3_bucket.internal.bucket config_dir = "dataset-config" diff --git a/terraform/lambda_functions.tf b/terraform/lambda_functions.tf index e850a81..cf1aab7 100644 --- a/terraform/lambda_functions.tf +++ b/terraform/lambda_functions.tf @@ -2,9 +2,9 @@ data "aws_ecr_authorization_token" "token" {} locals { lambda_container_image_uri_split = split("/", var.lambda_container_image_uri) - ecr_image_name_and_tag = split(":", element(local.lambda_container_image_uri_split, length(local.lambda_container_image_uri_split) - 1)) - ecr_image_name = "${local.environment}-${element(local.ecr_image_name_and_tag, 0)}" - ecr_image_tag = element(local.ecr_image_name_and_tag, 1) + ecr_image_name_and_tag = split(":", element(local.lambda_container_image_uri_split, length(local.lambda_container_image_uri_split) - 1)) + ecr_image_name = "${local.environment}-${element(local.ecr_image_name_and_tag, 0)}" + ecr_image_tag = element(local.ecr_image_name_and_tag, 1) # Truncate all function names to max 64 characters for AWS Lambda get_dataset_configuration_function_name = substr("${local.aws_resources_name}-get_dataset_configuration", 0, 64) @@ -365,10 +365,10 @@ resource "aws_lambda_function" "build_image_sets" { command = ["bignbit.build_image_sets.lambda_handler"] } - function_name = local.build_image_sets_function_name - role = aws_iam_role.bignbit_lambda_role.arn - timeout = 15 - memory_size = 128 + function_name = local.build_image_sets_function_name + role = aws_iam_role.bignbit_lambda_role.arn + timeout = 15 + memory_size = 128 environment { variables = { @@ -397,10 +397,10 @@ resource "aws_lambda_function" "send_to_gitc" { image_config { command = ["bignbit.send_to_gitc.lambda_handler"] } - function_name = local.send_to_gitc_function_name - role = aws_iam_role.bignbit_lambda_role.arn - timeout = 15 - memory_size = 128 + function_name = local.send_to_gitc_function_name + role = aws_iam_role.bignbit_lambda_role.arn + timeout = 15 + memory_size = 128 environment { variables = { @@ -430,19 +430,19 @@ resource "aws_lambda_function" "handle_gitc_response" { image_config { command = ["bignbit.handle_gitc_response.handler"] } - function_name = local.handle_gitc_response_function_name - role = aws_iam_role.bignbit_lambda_role.arn - timeout = 15 - memory_size = 128 + function_name = local.handle_gitc_response_function_name + role = aws_iam_role.bignbit_lambda_role.arn + timeout = 15 + memory_size = 128 environment { variables = { STACK_NAME = local.aws_resources_name CUMULUS_MESSAGE_ADAPTER_DIR = "/opt/" REGION = data.aws_region.current.name - POBIT_AUDIT_BUCKET_NAME = var.pobit_audit_bucket - POBIT_AUDIT_PATH_NAME = var.pobit_audit_path - CMR_ENVIRONMENT = local.environment != "OPS" ? "UAT" : "" + POBIT_AUDIT_BUCKET_NAME = var.pobit_audit_bucket + POBIT_AUDIT_PATH_NAME = var.pobit_audit_path + CMR_ENVIRONMENT = local.environment != "OPS" ? "UAT" : "" EDL_USER_SSM = var.edl_user_ssm EDL_PASS_SSM = var.edl_pass_ssm } @@ -465,10 +465,10 @@ resource "aws_lambda_function" "save_cnm_message" { image_config { command = ["bignbit.save_cnm_message.lambda_handler"] } - function_name = local.save_cnm_message_function_name - role = aws_iam_role.bignbit_lambda_role.arn - timeout = 15 - memory_size = 128 + function_name = local.save_cnm_message_function_name + role = aws_iam_role.bignbit_lambda_role.arn + timeout = 15 + memory_size = 128 environment { variables = { @@ -492,7 +492,7 @@ data "aws_iam_policy_document" "bignbit_lambda_assume_role_policy" { statement { actions = ["sts:AssumeRole"] principals { - type = "Service" + type = "Service" identifiers = ["lambda.amazonaws.com"] } } @@ -577,9 +577,6 @@ data "aws_iam_policy_document" "bignbit_lambda_policy" { "arn:aws:s3:::${local.harmony_bucket_name}/*", "arn:aws:s3:::${var.config_bucket}/*", "arn:aws:s3:::${var.pobit_audit_bucket}/*" - - !!!!!!also need permission for buckets where data lives!!!!! - ] } @@ -595,10 +592,37 @@ data "aws_iam_policy_document" "bignbit_lambda_policy" { } } +data "aws_iam_policy_document" "allow_data_buckets_access" { + statement { + sid = "AllowAccessToDataBuckets" + actions = [ + "s3:PutObject*", + "s3:GetObject*", + "s3:ListBucket*", + ] + resources = concat([ + for bucket in var.data_buckets : + "arn:aws:s3:::${bucket}" + ], + [ + for bucket in var.data_buckets : + "arn:aws:s3:::${bucket}/*" + ] + ) + } +} + +data "aws_iam_policy_document" "all_bignbit" { + source_policy_documents = [ + data.aws_iam_policy_document.bignbit_lambda_policy.json, + data.aws_iam_policy_document.allow_data_buckets_access.json + ] +} + resource "aws_iam_role_policy" "bignbit_policy_attach" { name = "${local.aws_resources_name}_bignbit_policy_attach" role = aws_iam_role.bignbit_lambda_role.id - policy = data.aws_iam_policy_document.bignbit_lambda_policy.json + policy = data.aws_iam_policy_document.all_bignbit.json } diff --git a/terraform/variables.tf b/terraform/variables.tf index 5ed4670..1934d84 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -8,6 +8,12 @@ variable "prefix" { description = "Prefix used for resource naming (project name, env name, etc...)" } +variable "data_buckets" { + type = set(string) + description = "Buckets where data to be imaged is stored (cumulus-public, cumulus-protected, etc...)" + default = [] +} + variable "config_bucket" { type = string description = "Bucket where dataset configuration is stored" diff --git a/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json b/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json index fe12e84..00e4e92 100644 --- a/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json +++ b/tests/sample_messages/cma.uat.workflow-input.20210115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.json @@ -1,5 +1,7 @@ { "meta": { + "provider": {}, + "stack": {}, "buckets": { "internal": { "name": "podaac-uat-svc-internal", diff --git a/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json index 7fbb981..dff05fb 100644 --- a/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json +++ b/tests/sample_messages/cma.uat.workflow-input.OPERA_L3_DSWx-HLS_T48SUE_20190302T034350Z_20230131T222341Z_L8_30_v0.0.json @@ -1,5 +1,7 @@ { "meta": { + "provider": {}, + "stack": {}, "buckets": { "internal": { "name": "podaac-uat-svc-internal", From a523404db821eedd2bb074881ab6f991a26bac78 Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:37:38 -0800 Subject: [PATCH 13/16] Update to place harmony results in our bucket --- .github/workflows/cicd-pipeline.yml | 3 ++ README.md | 15 ++++----- bignbit/apply_opera_hls_treatment.py | 34 ++++++++++++--------- bignbit/generate_image_metadata.py | 2 +- bignbit/submit_harmony_job.py | 8 ++--- terraform/lambda_functions.tf | 4 +-- terraform/main.tf | 24 --------------- terraform/outputs.tf | 10 ++++-- terraform/s3.tf | 42 +++++++++++++++++--------- terraform/state_machine_definition.tpl | 3 +- terraform/variables.tf | 6 ++-- 11 files changed, 77 insertions(+), 74 deletions(-) diff --git a/.github/workflows/cicd-pipeline.yml b/.github/workflows/cicd-pipeline.yml index 81cf2cf..3b9e492 100644 --- a/.github/workflows/cicd-pipeline.yml +++ b/.github/workflows/cicd-pipeline.yml @@ -137,9 +137,12 @@ jobs: - name: Install conda uses: conda-incubator/setup-miniconda@v3 with: + channels: conda-forge activate-environment: bignbit environment-file: conda-environment.yaml auto-activate-base: false + conda-remove-defaults: "true" + miniforge-version: latest - name: Install package run: poetry install - name: Lint diff --git a/README.md b/README.md index 28572b1..40dc48b 100644 --- a/README.md +++ b/README.md @@ -107,10 +107,10 @@ should define the bignbit module and the bignbit step function state machine. Se > [!IMPORTANT] > bignbit uses the [user owned bucket](https://harmony.earthdata.nasa.gov/docs#user-owned-buckets-for-harmony-output) parameter -> when making Harmony requests. If an existing bucket is configured for the `harmony_staging_bucket` parameter, it must -> have a bucket policy that allows Harmony to write objects to it. If `harmony_staging_bucket` is left blank, bignbit will -> create a new S3 bucket (named `{app_name}-{stage}-harmony-staging`) and apply the correct permissions automatically. This bucket will also automatically expire objects -> older than 30 days. +> when making Harmony requests. If an existing bucket is configured for the `bignbit_staging_bucket` parameter, it must +> have a bucket policy that allows Harmony write permission and GIBS read permission. If `bignbit_staging_bucket` is left blank, bignbit will +> create a new S3 bucket (named `svc-${var.app_name}-${var.prefix}-staging`) and apply the correct permissions automatically. +> This bucket will also automatically expire objects older than 30 days. bignbit uses the harmony-py library to construct the Harmony requests for generating images. Most of the parameters are extracted from the CMA message as a granule is being processed but the `width` and `height` parameters @@ -131,8 +131,8 @@ This module uses the following input variables: | config_dir | string | Path relative to `config_bucket` where dataset configuration is stored | "datset-config" | | pobit_audit_bucket | string | S3 bucket where messages exchanged with GITC will be saved. Typically the cumulus internal bucket | | | pobit_audit_path | string | Path relative to `pobit_audit_bucket` where messages exchanged with GITC will be saved. | "pobit-cma-output" | -| harmony_staging_bucket | string | S3 bucket where Harmony results will be saved. Leave blank to use bucket managed by this module. | _create new bucket named {app_name}-{stage}-harmony-staging_ | -| harmony_staging_path | string | Path relative to `harmony_staging_bucket` where harmony results will be saved. | "bignbit-harmony-output" | +| bignbit_staging_bucket | string | S3 bucket where generated images will be saved. Leave blank to use bucket managed by this module. | _create new bucket named {app_name}-{stage}-harmony-staging_ | +| harmony_staging_path | string | Path relative to `bignbit_staging_bucket` where harmony results will be saved. | "bignbit-harmony-output" | | gibs_region | string | Region where GIBS resources are deployed | | | gibs_queue_name | string | Name of the GIBS SQS queue where outgoing CNM messages will be sent | | | gibs_account_id | string | AWS account ID for GIBS | | @@ -173,8 +173,9 @@ This module supplies the following outputs: | pobit_send_to_gitc_arn | ARN of the lambda function | aws_lambda_function.send_to_gitc.arn | | pobit_save_cnm_message_arn | ARN of the lambda function | aws_lambda_function.save_cnm_message.arn | | workflow_definition | Rendered state machine definition | rendered version of state_machine_definition.tpl | -| harmony_staging_bucket | Name of harmony staging bucket | var.harmony_staging_bucket | +| bignbit_staging_bucket | Name of bignbit staging bucket | var.bignbit_staging_bucket | | harmony_staging_path | Path to harmony requests relative to harmony staging bucket | var.harmony_staging_path | +| bignbit_lambda_role | Role created by the module applied to lambda functions | aws_iam_role.bignbit_lambda_role | # Assumptions - Using `ContentBasedDeduplication` strategy for GITC input queue diff --git a/bignbit/apply_opera_hls_treatment.py b/bignbit/apply_opera_hls_treatment.py index fbad73b..cdcc96b 100644 --- a/bignbit/apply_opera_hls_treatment.py +++ b/bignbit/apply_opera_hls_treatment.py @@ -2,6 +2,7 @@ """ Transforms each image in the input using specific processing required to produce an image for display in GITC """ +import datetime import logging import os import pathlib @@ -51,15 +52,18 @@ def process(self) -> List[Dict]: A list of CMA file dictionaries pointing to the transformed image(s) """ cma_file_list = self.input['big'] + staging_bucket = self.config.get('bignbit_staging_bucket') mgrs_grid_code = utils.extract_mgrs_grid_code(self.input['granule_umm_json']) - file_metadata_list = transform_images(cma_file_list, pathlib.Path(f"{self.path}"), mgrs_grid_code) + file_metadata_list = transform_images(cma_file_list, pathlib.Path(f"{self.path}"), mgrs_grid_code, + staging_bucket) del self.input['big'] self.input['big'] = file_metadata_list return self.input -def transform_images(cma_file_list: List[Dict], temp_dir: pathlib.Path, mgrs_grid_code: str) -> List[Dict]: +def transform_images(cma_file_list: List[Dict], temp_dir: pathlib.Path, mgrs_grid_code: str, + staging_bucket: str) -> List[Dict]: """ Applies special OPERA HLS processing to each input image. Each input image will result in multiple output transformed images. @@ -72,6 +76,8 @@ def transform_images(cma_file_list: List[Dict], temp_dir: pathlib.Path, mgrs_gri Temporary working directory on local disk mgrs_grid_code MGRS grid code for the current granule being processed + staging_bucket + Staging bucket to which transformed files should be written Returns ------- @@ -96,7 +102,7 @@ def transform_images(cma_file_list: List[Dict], temp_dir: pathlib.Path, mgrs_gri CUMULUS_LOGGER.info(f'Created new images: {[str(t) for t in transformed_images_filepaths]}') # Create new file metadata for each new image - file_metadata_dicts = create_file_metadata(cma_file_meta, transformed_images_filepaths) + file_metadata_dicts = create_file_metadata(transformed_images_filepaths, staging_bucket) file_metadata_results.extend(file_metadata_dicts) # Upload new images to s3 @@ -205,7 +211,7 @@ def the_opera_hls_treatment(source_image_filepath: pathlib.Path, working_dirpath return result_image_filepaths -def create_file_metadata(original_cma_file_meta: dict, transformed_images_filepaths: List[pathlib.Path]) -> List[Dict]: +def create_file_metadata(transformed_images_filepaths: List[pathlib.Path], staging_bucket: str) -> List[Dict]: """ Generate a new CMA file metadata dictionary for each transformed image using the original CMA metadata as a template. @@ -215,10 +221,10 @@ def create_file_metadata(original_cma_file_meta: dict, transformed_images_filepa Parameters ---------- - original_cma_file_meta - CMA file metadata dict of the original source image transformed_images_filepaths Local filepaths to each output transformed image + staging_bucket + Staging bucket to which transformed files should be written Returns ------- @@ -227,14 +233,14 @@ def create_file_metadata(original_cma_file_meta: dict, transformed_images_filepa """ new_cma_file_meta_list = [] for transformed_image in transformed_images_filepaths: - new_cma_file_meta = original_cma_file_meta.copy() - new_cma_file_meta["fileName"] = transformed_image.name - # Takes the 'key' from the original and replace just the last part with the new filename - new_cma_file_meta["key"] = str(pathlib.Path(*pathlib.Path(original_cma_file_meta["key"]).parts[0:-1]).joinpath( - transformed_image.name)) - new_cma_file_meta["local_filepath"] = str(transformed_image.resolve()) - - new_cma_file_meta_list.append(new_cma_file_meta) + file_dict = { + "fileName": transformed_image.name, + "bucket": staging_bucket, + "key": f'opera_hls_processing/{datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%d")}/{transformed_image.name}', + "local_filepath": str(transformed_image.resolve()) + } + + new_cma_file_meta_list.append(file_dict) return new_cma_file_meta_list diff --git a/bignbit/generate_image_metadata.py b/bignbit/generate_image_metadata.py index a9901c0..aa405bd 100644 --- a/bignbit/generate_image_metadata.py +++ b/bignbit/generate_image_metadata.py @@ -94,7 +94,7 @@ def generate_metadata(cma_file_list: List[Dict], granule_umm_json: dict, temp_di granule_type = "browse" if granule_extension in BROWSE_IMAGE_EXTENSION_SUBTYPES else "metadata" if granule_type == "browse": granule_subtype = BROWSE_IMAGE_EXTENSION_SUBTYPES.get(granule_extension, None) - elif granule_extension.lower() == '.wld' or granule_extension.lower() == '.pgw' : + elif granule_extension.lower() == '.wld' or granule_extension.lower() == '.pgw': granule_subtype = "world file" else: granule_subtype = None diff --git a/bignbit/submit_harmony_job.py b/bignbit/submit_harmony_job.py index e17b6e9..0f1316d 100644 --- a/bignbit/submit_harmony_job.py +++ b/bignbit/submit_harmony_job.py @@ -38,20 +38,20 @@ def process(self): current_item = self.config.get('current_item') variable = current_item.get('id') big_config = self.config.get('big_config') - harmony_staging_bucket = self.config.get('harmony_staging_bucket') + bignbit_staging_bucket = self.config.get('bignbit_staging_bucket') harmony_staging_path = self.config.get('harmony_staging_path') harmony_job = submit_harmony_job(cmr_env, collection_concept_id, collection_name, granule_concept_id, - granule_id, variable, big_config, harmony_staging_bucket, harmony_staging_path) + granule_id, variable, big_config, bignbit_staging_bucket, harmony_staging_path) self.input['harmony_job'] = harmony_job return self.input def submit_harmony_job(cmr_env, collection_concept_id, collection_name, granule_concept_id, granule_id, variable, - big_config, harmony_staging_bucket, harmony_staging_path): + big_config, bignbit_staging_bucket, harmony_staging_path): """Generate harmony job and returns harmony job id""" - destination_bucket_url = f's3://{harmony_staging_bucket}/{harmony_staging_path}/{collection_name}/{datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%d")}'.lower() + destination_bucket_url = f's3://{bignbit_staging_bucket}/{harmony_staging_path}/{collection_name}/{datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%d")}'.lower() harmony_client = utils.get_harmony_client(cmr_env) harmony_request = generate_harmony_request(collection_concept_id, granule_concept_id, variable, big_config, destination_bucket_url) diff --git a/terraform/lambda_functions.tf b/terraform/lambda_functions.tf index cf1aab7..52b10a9 100644 --- a/terraform/lambda_functions.tf +++ b/terraform/lambda_functions.tf @@ -571,10 +571,10 @@ data "aws_iam_policy_document" "bignbit_lambda_policy" { "s3:DeleteObjectVersion", ] resources = [ - "arn:aws:s3:::${local.harmony_bucket_name}", + "arn:aws:s3:::${local.staging_bucket_name}", "arn:aws:s3:::${var.config_bucket}", "arn:aws:s3:::${var.pobit_audit_bucket}", - "arn:aws:s3:::${local.harmony_bucket_name}/*", + "arn:aws:s3:::${local.staging_bucket_name}/*", "arn:aws:s3:::${var.config_bucket}/*", "arn:aws:s3:::${var.pobit_audit_bucket}/*" ] diff --git a/terraform/main.tf b/terraform/main.tf index 03409cd..866895c 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -26,30 +26,6 @@ provider "aws" { data "aws_caller_identity" "current" {} data "aws_region" "current" {} -# -# data "template_file" "workflow_definition" { -# template = file("${path.module}/state_machine_definition.tpl") -# vars = { -# GetDatasetConfigurationLambda = aws_lambda_function.get_dataset_configuration.arn, -# ConfigBucket = var.config_bucket, -# ConfigDir = var.config_dir, -# GetGranuleUmmJsonLambda = aws_lambda_function.get_granule_umm_json.arn, -# IdentifyImageFileLambda = aws_lambda_function.identify_image_file.arn, -# ApplyOperaHLSTreatmentLambda = aws_lambda_function.apply_opera_hls_treatment.arn, -# GetCollectionConceptIdLambda = aws_lambda_function.get_collection_concept_id.arn, -# SubmitHarmonyJobLambda = aws_lambda_function.submit_harmony_job.arn, -# GetHarmonyJobStatusLambda = aws_lambda_function.get_harmony_job_status.arn, -# GenerateImageMetadataLambda = aws_lambda_function.generate_image_metadata.arn, -# BuildImageSetsLambda = aws_lambda_function.build_image_sets.arn, -# SendToGITCLambda = aws_lambda_function.send_to_gitc.arn, -# SaveCNMMessageLambda = aws_lambda_function.save_cnm_message.arn, -# PobitAuditBucket = var.pobit_audit_bucket, -# PobitAuditPath = var.pobit_audit_path, -# HarmonyStagingBucket = var.harmony_staging_bucket, -# HarmonyStagingPath = var.harmony_staging_path -# } -# } - locals { environment = var.stage diff --git a/terraform/outputs.tf b/terraform/outputs.tf index 1599f39..404f5fa 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -96,15 +96,19 @@ output "workflow_definition" { SaveCNMMessageLambda = aws_lambda_function.save_cnm_message.arn, PobitAuditBucket = var.pobit_audit_bucket, PobitAuditPath = var.pobit_audit_path, - HarmonyStagingBucket = local.harmony_bucket_name, + StagingBucket = local.staging_bucket_name, HarmonyStagingPath = var.harmony_staging_path }) } -output "harmony_staging_bucket" { - value = local.harmony_bucket_name +output "bignbit_staging_bucket" { + value = local.staging_bucket_name } output "harmony_staging_path" { value = var.harmony_staging_path +} + +output "bignbit_lambda_role" { + value = aws_iam_role.bignbit_lambda_role } \ No newline at end of file diff --git a/terraform/s3.tf b/terraform/s3.tf index 417a2c1..55667f1 100644 --- a/terraform/s3.tf +++ b/terraform/s3.tf @@ -1,12 +1,12 @@ -# Create a bucket to store harmony results in unless one is provided as a variable +# Create a bucket to store bignbit results in unless one is provided as a variable locals { - create_bucket = var.harmony_staging_bucket == "" - harmony_bucket_name = local.create_bucket ? aws_s3_bucket.harmony_staging_bucket[0].id : var.harmony_staging_bucket + create_bucket = var.bignbit_staging_bucket == "" + staging_bucket_name = local.create_bucket ? aws_s3_bucket.bignbit_staging_bucket[0].id : var.bignbit_staging_bucket } -resource "aws_s3_bucket" "harmony_staging_bucket" { +resource "aws_s3_bucket" "bignbit_staging_bucket" { count = local.create_bucket ? 1 : 0 - bucket = "${local.aws_resources_name}-harmony-staging" + bucket = "${local.aws_resources_name}-staging" lifecycle { ignore_changes = [ @@ -17,7 +17,7 @@ resource "aws_s3_bucket" "harmony_staging_bucket" { resource "aws_s3_bucket_ownership_controls" "disable_acls" { count = local.create_bucket ? 1 : 0 - bucket = aws_s3_bucket.harmony_staging_bucket[0].id + bucket = aws_s3_bucket.bignbit_staging_bucket[0].id rule { object_ownership = "BucketOwnerEnforced" @@ -26,7 +26,7 @@ resource "aws_s3_bucket_ownership_controls" "disable_acls" { resource "aws_s3_bucket_server_side_encryption_configuration" "enable_bucket_encryption" { count = local.create_bucket ? 1 : 0 - bucket = aws_s3_bucket.harmony_staging_bucket[0].id + bucket = aws_s3_bucket.bignbit_staging_bucket[0].id rule { bucket_key_enabled = true @@ -39,7 +39,7 @@ resource "aws_s3_bucket_server_side_encryption_configuration" "enable_bucket_enc resource "aws_s3_bucket_lifecycle_configuration" "expire_objects_30_days" { count = local.create_bucket ? 1 : 0 - bucket = aws_s3_bucket.harmony_staging_bucket[0].id + bucket = aws_s3_bucket.bignbit_staging_bucket[0].id rule { id = "ExpireHarmonyObjectsAfter30Days" @@ -51,12 +51,23 @@ resource "aws_s3_bucket_lifecycle_configuration" "expire_objects_30_days" { prefix = var.harmony_staging_path } } + + rule { + id = "ExpireOperaHLSObjectsAfter30Days" + status = "Enabled" + expiration { + days = 30 + } + filter { + prefix = "opera_hls_processing/" + } + } } -resource "aws_s3_bucket_policy" "harmony_staging_bucket_policy" { +resource "aws_s3_bucket_policy" "bignbit_staging_bucket_policy" { count = local.create_bucket ? 1 : 0 - bucket = aws_s3_bucket.harmony_staging_bucket[0].id - policy = data.aws_iam_policy_document.harmony_staging_bucket_policy[0].json + bucket = aws_s3_bucket.bignbit_staging_bucket[0].id + policy = data.aws_iam_policy_document.bignbit_staging_bucket_policy[0].json } data "aws_iam_policy_document" "allow_harmony_write" { @@ -68,7 +79,7 @@ data "aws_iam_policy_document" "allow_harmony_write" { "s3:PutObject", ] resources = [ - "${aws_s3_bucket.harmony_staging_bucket[0].arn}/${var.harmony_staging_path}/*" + "${aws_s3_bucket.bignbit_staging_bucket[0].arn}/${var.harmony_staging_path}/*" ] principals { identifiers = ["arn:aws:iam::549360732797:root", "arn:aws:iam::625642860590:root"] @@ -86,7 +97,7 @@ data "aws_iam_policy_document" "allow_harmony_location" { "s3:GetBucketLocation", ] resources = [ - aws_s3_bucket.harmony_staging_bucket[0].arn + aws_s3_bucket.bignbit_staging_bucket[0].arn ] principals { identifiers = ["arn:aws:iam::549360732797:root", "arn:aws:iam::625642860590:root"] @@ -104,7 +115,8 @@ data "aws_iam_policy_document" "allow_gibs_getobject" { "s3:GetObject*", ] resources = [ - "${aws_s3_bucket.harmony_staging_bucket[0].arn}/${var.harmony_staging_path}/*" + "${aws_s3_bucket.bignbit_staging_bucket[0].arn}/${var.harmony_staging_path}/*", + "${aws_s3_bucket.bignbit_staging_bucket[0].arn}/opera_hls_processing/*" ] principals { identifiers = ["arn:aws:iam::${var.gibs_account_id}:root"] @@ -113,7 +125,7 @@ data "aws_iam_policy_document" "allow_gibs_getobject" { } } -data "aws_iam_policy_document" "harmony_staging_bucket_policy" { +data "aws_iam_policy_document" "bignbit_staging_bucket_policy" { count = local.create_bucket ? 1 : 0 source_policy_documents = [ data.aws_iam_policy_document.allow_harmony_write[0].json, diff --git a/terraform/state_machine_definition.tpl b/terraform/state_machine_definition.tpl index 3513a58..3b67436 100644 --- a/terraform/state_machine_definition.tpl +++ b/terraform/state_machine_definition.tpl @@ -162,6 +162,7 @@ "cma":{ "event.$":"$", "task_config":{ + "bignbit_staging_bucket": "${StagingBucket}", "cumulus_message":{ "input":"{$.payload}" } @@ -260,7 +261,7 @@ "cmr_environment":"{$.meta.cmr.cmrEnvironment}", "cmr_clientid":"{$.meta.cmr.clientId}", "current_item":"{$.current_item}", - "harmony_staging_bucket": "${HarmonyStagingBucket}", + "bignbit_staging_bucket": "${StagingBucket}", "harmony_staging_path": "${HarmonyStagingPath}", "big_config":"{$.payload.datasetConfigurationForBIG}", "cumulus_message":{ diff --git a/terraform/variables.tf b/terraform/variables.tf index 1934d84..461e816 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -36,15 +36,15 @@ variable "pobit_audit_path" { default = "pobit-cma-output" } -variable "harmony_staging_bucket" { +variable "bignbit_staging_bucket" { type = string - description = "S3 bucket where Harmony results will be saved. Leave blank to use bucket managed by this module." + description = "S3 bucket where generated images will be saved. Leave blank to use bucket managed by this module." default = "" } variable "harmony_staging_path" { type = string - description = "Path relative to harmony_staging_bucket where harmony results will be saved." + description = "Path relative to bignbit_staging_bucket where harmony results will be saved." default = "bignbit-harmony-output" } From 55a9ecd31e755d5d6e0effc811d0b03f302ba829 Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:48:13 -0800 Subject: [PATCH 14/16] Update to place harmony results in our bucket --- .github/workflows/cicd-pipeline.yml | 2 +- CHANGELOG.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cicd-pipeline.yml b/.github/workflows/cicd-pipeline.yml index 3b9e492..ed3ce3c 100644 --- a/.github/workflows/cicd-pipeline.yml +++ b/.github/workflows/cicd-pipeline.yml @@ -162,7 +162,7 @@ jobs: terraform init -backend=false -upgrade terraform validate -no-color - name: SonarCloud Scan - uses: sonarsource/sonarcloud-github-action@master + uses: sonarsource/sonarqube-scan-action@v4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a70ac2..8cc04cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- [issues/9](https://github.com/podaac/bignbit/issues/9): Added some documentation for installing as cumulus module ### Changed - [issues/15](https://github.com/podaac/bignbit/issues/15): Change 'convertToPNG' choice to a generic send to harmony choice - [issues/16](https://github.com/podaac/bignbit/issues/16): Change apply opera treatment choice and lambda to be specific to HLS +- [issues/23](https://github.com/podaac/bignbit/issues/23): Harmony requests now include `destinationUrl` parameter to place output + directly in s3 bucket instead of requiring data to be copied. +- [issues/41](https://github.com/podaac/bignbit/issues/41): Module no longer depends on deprecated hashicorp/template provider +- [issues/42](https://github.com/podaac/bignbit/issues/42): Terraform version upgraded to v1.5.3 ### Deprecated ### Removed - [issues/7](https://github.com/podaac/bignbit/issues/15): Remove the wait for GITC response From 715a63e7ce133a1d23f451fced9f521290342c78 Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:55:09 -0800 Subject: [PATCH 15/16] Update to place harmony results in our bucket --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cc04cc..8637b36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed - [issues/7](https://github.com/podaac/bignbit/issues/15): Remove the wait for GITC response +- [issues/23](https://github.com/podaac/bignbit/issues/23): Removed `lambda_role` module variable. The lambda role is now created as part of the module, `permissions_boundary_arn` is required instead. ### Fixed - [issues/36](https://github.com/podaac/bignbit/issues/36): Support datetimes without microseconds ### Security From d755172be6c59a40d337cdc07bccb9788e14f2da Mon Sep 17 00:00:00 2001 From: Frank Greguska <89428916+frankinspace@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:12:00 -0800 Subject: [PATCH 16/16] Update to place harmony results in our bucket --- README.md | 46 ++++++++++++++++++++-------------------- stepfunctions_graph.png | Bin 0 -> 129376 bytes 2 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 stepfunctions_graph.png diff --git a/README.md b/README.md index 40dc48b..fddb075 100644 --- a/README.md +++ b/README.md @@ -122,28 +122,28 @@ See `bignbit.submit_harmony_job.generate_harmony_request` for details on how the This module uses the following input variables: -| Name | Type | Description | Default Value | -|----------------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| -| stage | string | Environment used for resource tagging (dev, int, ops, etc...) | | -| prefix | string | Prefix used for resource naming (project name, env name, etc...) | | -| data_buckets | list(string) | List of buckets where data is stored. Lambdas will be given read/write access to these buckets. | [] | -| config_bucket | string | Bucket where dataset configuration is stored | | -| config_dir | string | Path relative to `config_bucket` where dataset configuration is stored | "datset-config" | -| pobit_audit_bucket | string | S3 bucket where messages exchanged with GITC will be saved. Typically the cumulus internal bucket | | -| pobit_audit_path | string | Path relative to `pobit_audit_bucket` where messages exchanged with GITC will be saved. | "pobit-cma-output" | -| bignbit_staging_bucket | string | S3 bucket where generated images will be saved. Leave blank to use bucket managed by this module. | _create new bucket named {app_name}-{stage}-harmony-staging_ | -| harmony_staging_path | string | Path relative to `bignbit_staging_bucket` where harmony results will be saved. | "bignbit-harmony-output" | -| gibs_region | string | Region where GIBS resources are deployed | | -| gibs_queue_name | string | Name of the GIBS SQS queue where outgoing CNM messages will be sent | | -| gibs_account_id | string | AWS account ID for GIBS | | -| edl_user_ssm | string | Name of SSM parameter containing EDL username for querying CMR | | -| edl_pass_ssm | string | Name of SSM parameter containing EDL password for querying CMR | | -| permissions_boundary_arn | string | Permissions boundary ARN to apply to the roles created by this module. If not provided, no permissions boundary will be applied. | | -| security_group_ids | list(string) | | | -| subnet_ids | list(string) | | | -| app_name | string | | "bignbit" | -| default_tags | map(string) | | {} | -| lambda_container_image_uri | string | | "" | +| Name | Type | Description | Default Value | +|----------------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------| +| stage | string | Environment used for resource tagging (dev, int, ops, etc...) | | +| prefix | string | Prefix used for resource naming (project name, env name, etc...) | | +| data_buckets | list(string) | List of buckets where data is stored. Lambdas will be given read/write access to these buckets. | [] | +| config_bucket | string | Bucket where dataset configuration is stored | | +| config_dir | string | Path relative to `config_bucket` where dataset configuration is stored | "datset-config" | +| pobit_audit_bucket | string | S3 bucket where messages exchanged with GITC will be saved. Typically the cumulus internal bucket | | +| pobit_audit_path | string | Path relative to `pobit_audit_bucket` where messages exchanged with GITC will be saved. | "pobit-cma-output" | +| bignbit_staging_bucket | string | S3 bucket where generated images will be saved. Leave blank to use bucket managed by this module. | _create new bucket named svc-${var.app_name}-${var.prefix}-staging_ | +| harmony_staging_path | string | Path relative to `bignbit_staging_bucket` where harmony results will be saved. | "bignbit-harmony-output" | +| gibs_region | string | Region where GIBS resources are deployed | | +| gibs_queue_name | string | Name of the GIBS SQS queue where outgoing CNM messages will be sent | | +| gibs_account_id | string | AWS account ID for GIBS | | +| edl_user_ssm | string | Name of SSM parameter containing EDL username for querying CMR | | +| edl_pass_ssm | string | Name of SSM parameter containing EDL password for querying CMR | | +| permissions_boundary_arn | string | Permissions boundary ARN to apply to the roles created by this module. If not provided, no permissions boundary will be applied. | | +| security_group_ids | list(string) | | | +| subnet_ids | list(string) | | | +| app_name | string | | "bignbit" | +| default_tags | map(string) | | {} | +| lambda_container_image_uri | string | | "" | # Module Outputs @@ -183,7 +183,7 @@ This module supplies the following outputs: # Step Function _Visual representation of the bignbit step function state machine:_ -![image](https://github.com/podaac/bignbit/assets/89428916/4db5ae4b-ca74-4bee-bee7-2d7d1a342bd7) +![image](stepfunctions_graph.png) # Local Development ## MacOS diff --git a/stepfunctions_graph.png b/stepfunctions_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..acd4dd081bb22d33709a3e881a0bc73ef2362f1c GIT binary patch literal 129376 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�D^v| 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 O@S}NM2U)CQ6a7EfY!^HL literal 0 HcmV?d00001